├── ios
├── Runner
│ ├── Runner-Bridging-Header.h
│ ├── Assets.xcassets
│ │ ├── LaunchImage.imageset
│ │ │ ├── LaunchImage.png
│ │ │ ├── LaunchImage@2x.png
│ │ │ ├── LaunchImage@3x.png
│ │ │ ├── README.md
│ │ │ └── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ ├── Icon-App-20x20@1x.png
│ │ │ ├── Icon-App-20x20@2x.png
│ │ │ ├── Icon-App-20x20@3x.png
│ │ │ ├── Icon-App-29x29@1x.png
│ │ │ ├── Icon-App-29x29@2x.png
│ │ │ ├── Icon-App-29x29@3x.png
│ │ │ ├── Icon-App-40x40@1x.png
│ │ │ ├── Icon-App-40x40@2x.png
│ │ │ ├── Icon-App-40x40@3x.png
│ │ │ ├── Icon-App-60x60@2x.png
│ │ │ ├── Icon-App-60x60@3x.png
│ │ │ ├── Icon-App-76x76@1x.png
│ │ │ ├── Icon-App-76x76@2x.png
│ │ │ ├── Icon-App-1024x1024@1x.png
│ │ │ ├── Icon-App-83.5x83.5@2x.png
│ │ │ └── Contents.json
│ ├── AppDelegate.swift
│ ├── Base.lproj
│ │ ├── Main.storyboard
│ │ └── LaunchScreen.storyboard
│ └── Info.plist
├── Flutter
│ ├── Debug.xcconfig
│ ├── Release.xcconfig
│ ├── AppFrameworkInfo.plist
│ └── flutter_export_environment.sh
├── Runner.xcodeproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── WorkspaceSettings.xcsettings
│ │ │ └── IDEWorkspaceChecks.plist
│ ├── xcshareddata
│ │ └── xcschemes
│ │ │ └── Runner.xcscheme
│ └── project.pbxproj
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── WorkspaceSettings.xcsettings
│ │ └── IDEWorkspaceChecks.plist
├── .gitignore
├── Podfile
└── Podfile.lock
├── assets
├── way.png
├── Group.png
├── marker.flr
├── parking.png
├── shake_hands.png
├── shake_handss.png
├── user_friendly.png
└── fonts
│ ├── K2D-Bold.ttf
│ ├── K2D-Light.ttf
│ ├── K2D-Medium.ttf
│ ├── K2D-Regular.ttf
│ ├── K2D-SemiBold.ttf
│ └── K2D-ExtraBold.ttf
├── web
├── favicon.png
├── icons
│ ├── Icon-192.png
│ └── Icon-512.png
├── manifest.json
└── index.html
├── android
├── gradle.properties
├── app
│ ├── src
│ │ ├── main
│ │ │ ├── res
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxxhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── drawable
│ │ │ │ │ └── launch_background.xml
│ │ │ │ ├── drawable-v21
│ │ │ │ │ └── launch_background.xml
│ │ │ │ ├── values
│ │ │ │ │ └── styles.xml
│ │ │ │ └── values-night
│ │ │ │ │ └── styles.xml
│ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ └── example
│ │ │ │ │ └── the_parker
│ │ │ │ │ └── MainActivity.kt
│ │ │ └── AndroidManifest.xml
│ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ └── profile
│ │ │ └── AndroidManifest.xml
│ └── build.gradle
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
├── .gitignore
├── settings.gradle
└── build.gradle
├── lib
├── UI
│ ├── views
│ │ ├── home
│ │ │ ├── home_viewmodel.dart
│ │ │ ├── subviews
│ │ │ │ ├── ProfilePage.dart
│ │ │ │ └── MapPage.dart
│ │ │ └── home_view.dart
│ │ ├── login
│ │ │ ├── login_viewmodel.dart
│ │ │ └── login_view.dart
│ │ ├── welcome
│ │ │ ├── welcome_viewmodel.dart
│ │ │ ├── welcome_view.dart
│ │ │ └── IntroPage.dart
│ │ ├── add_address
│ │ │ ├── add_address_viewmodel.dart
│ │ │ └── add_address_view.dart
│ │ ├── mobile_no_login
│ │ │ ├── mobile_no_login_viewmodel.dart
│ │ │ └── mobile_no_login_view.dart
│ │ ├── forgot_password
│ │ │ ├── forgot_password_viewmodel.dart
│ │ │ └── forgot_password_view.dart
│ │ ├── offer_parking_map
│ │ │ ├── offer_parking_map_viewmodel.dart
│ │ │ └── offer_parking_map_view.dart
│ │ └── parking_spot_detail
│ │ │ ├── parking_spot_detail_viewmodel.dart
│ │ │ └── parking_spot_detail_view.dart
│ ├── Widgets
│ │ ├── LiquidSwipe
│ │ │ ├── page.dart
│ │ │ ├── Constants
│ │ │ │ └── constants.dart
│ │ │ ├── Animation_Gesture
│ │ │ │ ├── page_reveal.dart
│ │ │ │ ├── animated_page_dragger.dart
│ │ │ │ └── page_dragger.dart
│ │ │ ├── liquid_swipe.dart
│ │ │ └── WaveLayer.dart
│ │ ├── ReusableRoundedButton.dart
│ │ ├── LoginRoundedButton.dart
│ │ ├── FloatingAppbar.dart
│ │ ├── ProfileWidget.dart
│ │ └── TopBar.dart
│ └── Resources
│ │ ├── Resources.dart
│ │ └── ConstantMethods.dart
├── Core
│ └── Services
│ │ ├── thirdparty_services_module.dart
│ │ └── GoogleMapServices.dart
├── app
│ ├── locator.dart
│ └── locator.config.dart
├── generated_plugin_registrant.dart
└── main.dart
├── .metadata
├── LICENSE
├── test
└── widget_test.dart
├── pubspec.yaml
├── .gitignore
├── README.md
└── .flutter-plugins-dependencies
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/assets/way.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/assets/way.png
--------------------------------------------------------------------------------
/assets/Group.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/assets/Group.png
--------------------------------------------------------------------------------
/web/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/web/favicon.png
--------------------------------------------------------------------------------
/assets/marker.flr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/assets/marker.flr
--------------------------------------------------------------------------------
/assets/parking.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/assets/parking.png
--------------------------------------------------------------------------------
/assets/shake_hands.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/assets/shake_hands.png
--------------------------------------------------------------------------------
/assets/shake_handss.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/assets/shake_handss.png
--------------------------------------------------------------------------------
/assets/user_friendly.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/assets/user_friendly.png
--------------------------------------------------------------------------------
/web/icons/Icon-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/web/icons/Icon-192.png
--------------------------------------------------------------------------------
/web/icons/Icon-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/web/icons/Icon-512.png
--------------------------------------------------------------------------------
/assets/fonts/K2D-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/assets/fonts/K2D-Bold.ttf
--------------------------------------------------------------------------------
/assets/fonts/K2D-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/assets/fonts/K2D-Light.ttf
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 |
--------------------------------------------------------------------------------
/assets/fonts/K2D-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/assets/fonts/K2D-Medium.ttf
--------------------------------------------------------------------------------
/assets/fonts/K2D-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/assets/fonts/K2D-Regular.ttf
--------------------------------------------------------------------------------
/assets/fonts/K2D-SemiBold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/assets/fonts/K2D-SemiBold.ttf
--------------------------------------------------------------------------------
/assets/fonts/K2D-ExtraBold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/assets/fonts/K2D-ExtraBold.ttf
--------------------------------------------------------------------------------
/lib/UI/views/home/home_viewmodel.dart:
--------------------------------------------------------------------------------
1 | import 'package:stacked/stacked.dart';
2 |
3 | class HomeViewModel extends BaseViewModel {}
4 |
--------------------------------------------------------------------------------
/lib/UI/views/login/login_viewmodel.dart:
--------------------------------------------------------------------------------
1 | import 'package:stacked/stacked.dart';
2 |
3 | class LoginViewModel extends BaseViewModel {}
--------------------------------------------------------------------------------
/lib/UI/views/welcome/welcome_viewmodel.dart:
--------------------------------------------------------------------------------
1 | import 'package:stacked/stacked.dart';
2 |
3 | class WelcomeViewModel extends BaseViewModel {}
--------------------------------------------------------------------------------
/lib/UI/views/add_address/add_address_viewmodel.dart:
--------------------------------------------------------------------------------
1 | import 'package:stacked/stacked.dart';
2 |
3 | class AddAddressViewModel extends BaseViewModel {}
--------------------------------------------------------------------------------
/lib/UI/views/mobile_no_login/mobile_no_login_viewmodel.dart:
--------------------------------------------------------------------------------
1 | import 'package:stacked/stacked.dart';
2 |
3 | class MobileNoLoginViewModel extends BaseViewModel {}
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/lib/UI/views/forgot_password/forgot_password_viewmodel.dart:
--------------------------------------------------------------------------------
1 | import 'package:stacked/stacked.dart';
2 |
3 | class ForgotPasswordViewModel extends BaseViewModel {}
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/lib/UI/views/offer_parking_map/offer_parking_map_viewmodel.dart:
--------------------------------------------------------------------------------
1 | import 'package:stacked/stacked.dart';
2 |
3 | class OfferParkingMapViewModel extends BaseViewModel {}
--------------------------------------------------------------------------------
/lib/UI/views/parking_spot_detail/parking_spot_detail_viewmodel.dart:
--------------------------------------------------------------------------------
1 | import 'package:stacked/stacked.dart';
2 |
3 | class ParkingSpotDetailViewModel extends BaseViewModel {}
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ketanchoyal/theParker-Flutter/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/example/the_parker/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.the_parker
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
2 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
3 | #include "Generated.xcconfig"
4 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
2 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
3 | #include "Generated.xcconfig"
4 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Jun 23 08:50:38 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
7 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
9 | # Remember to never publicly share your keystore.
10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
11 | key.properties
12 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: 7a4c33425ddd78c54aba07d86f3f9a4a0051769b
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/lib/Core/Services/thirdparty_services_module.dart:
--------------------------------------------------------------------------------
1 | import 'package:injectable/injectable.dart';
2 | import 'package:stacked_services/stacked_services.dart';
3 |
4 | @module
5 | abstract class ThirdPartyServicesModule {
6 | @lazySingleton
7 | NavigationService get navigationService;
8 | @lazySingleton
9 | DialogService get dialogService;
10 | @lazySingleton
11 | SnackbarService get snackbarService;
12 | }
13 |
--------------------------------------------------------------------------------
/lib/app/locator.dart:
--------------------------------------------------------------------------------
1 | import 'package:get_it/get_it.dart';
2 | import 'package:injectable/injectable.dart';
3 |
4 | import 'locator.config.dart';
5 |
6 | final locator = GetIt.instance;
7 |
8 | ///[Run this to generate locator Code][Run everytime a new service is registered (using lazy or singleton or whatever)] flutter pub run build_runner build --delete-conflicting-outputs
9 | @injectableInit
10 | void setupLocator() => $initGetIt(locator);
11 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
4 | def properties = new Properties()
5 |
6 | assert localPropertiesFile.exists()
7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
8 |
9 | def flutterSdkPath = properties.getProperty("flutter.sdk")
10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
12 |
--------------------------------------------------------------------------------
/lib/UI/Widgets/LiquidSwipe/page.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | /// This is the class which contains the Page UI.
4 | class Page extends StatelessWidget {
5 | ///page details
6 | final Container pageView;
7 |
8 | ///percent visible of page
9 | final double percentVisible;
10 |
11 | //Constructor
12 | Page({
13 | this.pageView,
14 | this.percentVisible = 1.0,
15 | });
16 |
17 | @override
18 | Widget build(BuildContext context) {
19 | return this.pageView;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/lib/UI/Widgets/LiquidSwipe/Constants/constants.dart:
--------------------------------------------------------------------------------
1 | /// This package contains all the constants used.
2 |
3 | /// A constant value with works like a sensitivity of reveal.
4 | const FULL_TARNSITION_PX = 300.0;
5 |
6 | const PERCENT_PER_MILLISECOND = 0.00125;
7 |
8 | enum SlideDirection {
9 | leftToRight,
10 | rightToLeft,
11 | none,
12 | }
13 |
14 | enum UpdateType {
15 | dragging,
16 | doneDragging,
17 | animating,
18 | doneAnimating,
19 | }
20 |
21 | enum TransitionGoal {
22 | open,
23 | close,
24 | }
25 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-v21/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/lib/generated_plugin_registrant.dart:
--------------------------------------------------------------------------------
1 | //
2 | // Generated file. Do not edit.
3 | //
4 |
5 | // ignore_for_file: lines_longer_than_80_chars
6 |
7 | import 'package:geolocator_web/geolocator_web.dart';
8 | import 'package:location_web/location_web.dart';
9 |
10 | import 'package:flutter_web_plugins/flutter_web_plugins.dart';
11 |
12 | // ignore: public_member_api_docs
13 | void registerPlugins(Registrar registrar) {
14 | GeolocatorPlugin.registerWith(registrar);
15 | LocationWebPlugin.registerWith(registrar);
16 | registrar.registerMessageHandler();
17 | }
18 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 | import GoogleMaps
4 |
5 | @UIApplicationMain
6 | @objc class AppDelegate: FlutterAppDelegate {
7 | override func application(
8 | _ application: UIApplication,
9 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
10 | ) -> Bool {
11 | GMSServices.provideAPIKey(ApiKeys.GOOGLE_MAP_API_KEY)
12 | GeneratedPluginRegistrant.register(with: self)
13 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/web/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "the_parker",
3 | "short_name": "the_parker",
4 | "start_url": ".",
5 | "display": "standalone",
6 | "background_color": "#0175C2",
7 | "theme_color": "#0175C2",
8 | "description": "A new Flutter project.",
9 | "orientation": "portrait-primary",
10 | "prefer_related_applications": false,
11 | "icons": [
12 | {
13 | "src": "icons/Icon-192.png",
14 | "sizes": "192x192",
15 | "type": "image/png"
16 | },
17 | {
18 | "src": "icons/Icon-512.png",
19 | "sizes": "512x512",
20 | "type": "image/png"
21 | }
22 | ]
23 | }
24 |
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Flutter.podspec
20 | Flutter/Generated.xcconfig
21 | Flutter/app.flx
22 | Flutter/app.zip
23 | Flutter/flutter_assets/
24 | Flutter/flutter_export_environment.sh
25 | ServiceDefinitions.json
26 | Runner/GeneratedPluginRegistrant.*
27 |
28 | # Exceptions to above rules.
29 | !default.mode1v3
30 | !default.mode2v3
31 | !default.pbxuser
32 | !default.perspectivev3
33 |
34 | Keys.swift
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.3.50'
3 | repositories {
4 | google()
5 | jcenter()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:4.1.0'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | jcenter()
18 | }
19 | }
20 |
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 | project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | }
25 | subprojects {
26 | project.evaluationDependsOn(':app')
27 | }
28 |
29 | task clean(type: Delete) {
30 | delete rootProject.buildDir
31 | }
32 |
--------------------------------------------------------------------------------
/lib/Core/Services/GoogleMapServices.dart:
--------------------------------------------------------------------------------
1 | import 'package:google_maps_flutter/google_maps_flutter.dart';
2 | import 'package:http/http.dart' as http;
3 | import 'dart:convert';
4 |
5 | import 'package:the_parker/ui/resources/APIKeys.dart';
6 |
7 | class GoogleMapsServices {
8 | var apiKey = APIKeys.google_map_key;
9 | Future getRouteCoordinates(LatLng l1, LatLng l2) async {
10 | String url =
11 | "https://maps.googleapis.com/maps/api/directions/json?origin=${l1.latitude},${l1.longitude}&destination=${l2.latitude},${l2.longitude}&key=$apiKey";
12 | http.Response response = await http.get(url);
13 | Map values = jsonDecode(response.body);
14 | return values["routes"][0]["overview_polyline"]["points"];
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 8.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Flutter/flutter_export_environment.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | # This is a generated file; do not edit or check into version control.
3 | export "FLUTTER_ROOT=/Users/ketanchoyal/Development/flutter"
4 | export "FLUTTER_APPLICATION_PATH=/Users/ketanchoyal/Desktop/Project Works/The Parker/TheParker-Flutter/the_parker"
5 | export "FLUTTER_TARGET=/Users/ketanchoyal/Desktop/Project Works/The Parker/TheParker-Flutter/the_parker/lib/main.dart"
6 | export "FLUTTER_BUILD_DIR=build"
7 | export "SYMROOT=${SOURCE_ROOT}/../build/ios"
8 | export "FLUTTER_BUILD_NAME=1.0.0"
9 | export "FLUTTER_BUILD_NUMBER=1"
10 | export "DART_DEFINES=flutter.inspector.structuredErrors%3Dtrue,FLUTTER_WEB_AUTO_DETECT%3Dtrue"
11 | export "DART_OBFUSCATION=false"
12 | export "TRACK_WIDGET_CREATION=true"
13 | export "TREE_SHAKE_ICONS=false"
14 | export "PACKAGE_CONFIG=/Users/ketanchoyal/Desktop/Project Works/The Parker/TheParker-Flutter/the_parker/.dart_tool/package_config.json"
15 |
--------------------------------------------------------------------------------
/lib/UI/Widgets/LiquidSwipe/Animation_Gesture/page_reveal.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | import '../Constants/constants.dart';
4 | import '../WaveLayer.dart';
5 |
6 | /// This class reveals the next page in the liquid wave form.
7 |
8 | class PageReveal extends StatelessWidget {
9 | final double revealPercent;
10 | final Widget child;
11 | final SlideDirection slideDirection;
12 |
13 | //Constructor
14 | PageReveal({
15 | this.revealPercent,
16 | this.child,
17 | this.slideDirection,
18 | });
19 |
20 | @override
21 | Widget build(BuildContext context) {
22 | //ClipPath clips our Container (page) with clipper based on path..
23 | return ClipPath(
24 | clipper: WaveLayer(
25 | revealPercent: slideDirection == SlideDirection.leftToRight
26 | ? 1.0 - revealPercent
27 | : revealPercent,
28 | slideDirection: slideDirection,
29 | ),
30 | child: child,
31 | );
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/lib/UI/Widgets/ReusableRoundedButton.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:the_parker/ui/resources/ConstantMethods.dart';
3 |
4 | class ReusableRoundedButton extends StatelessWidget {
5 | final Function onPressed;
6 | final double height;
7 | final Color backgroundColor;
8 | final Widget child;
9 | final double elevation;
10 |
11 | const ReusableRoundedButton(
12 | {@required this.onPressed,
13 | this.height,
14 | this.elevation,
15 | this.backgroundColor,
16 | @required this.child});
17 |
18 | @override
19 | Widget build(BuildContext context) {
20 | return Card(
21 | color: backgroundColor ?? Theme.of(context).primaryColor,
22 | elevation: elevation ?? 10,
23 | shape: kRoundedButtonShape,
24 | child: MaterialButton(
25 | height: height,
26 | // minWidth: 300,
27 | // elevation: 10,
28 | shape: kRoundedButtonShape,
29 | onPressed: onPressed,
30 | child: child,
31 | ),
32 | );
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/lib/UI/Widgets/LoginRoundedButton.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | import 'ReusableRoundedButton.dart';
4 |
5 | class LoginRoundedButton extends StatelessWidget {
6 | final Function onPressed;
7 | final String label;
8 | final String heroTag;
9 | const LoginRoundedButton({this.onPressed, this.label, this.heroTag});
10 |
11 | @override
12 | Widget build(BuildContext context) {
13 | return Align(
14 | alignment: Alignment.bottomRight,
15 | child: Hero(
16 | tag: heroTag ?? 'login',
17 | transitionOnUserGestures: true,
18 | child: ReusableRoundedButton(
19 | child: Text(
20 | label ?? 'Login',
21 | style: TextStyle(
22 | fontWeight: FontWeight.w800,
23 | color: Colors.white,
24 | fontSize: 15,
25 | ),
26 | ),
27 | // text: 'Login',
28 | onPressed: onPressed,
29 | height: 50,
30 | // backgroundColor: Colors.redAccent,
31 | ),
32 | ),
33 | );
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values-night/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 Ketan Choyal
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/test/widget_test.dart:
--------------------------------------------------------------------------------
1 | // This is a basic Flutter widget test.
2 | //
3 | // To perform an interaction with a widget in your test, use the WidgetTester
4 | // utility that Flutter provides. For example, you can send tap and scroll
5 | // gestures. You can also use WidgetTester to find child widgets in the widget
6 | // tree, read text, and verify that the values of widget properties are correct.
7 |
8 | import 'package:flutter/material.dart';
9 | import 'package:flutter_test/flutter_test.dart';
10 |
11 | import 'package:the_parker/main.dart';
12 |
13 | void main() {
14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async {
15 | // Build our app and trigger a frame.
16 | await tester.pumpWidget(MyApp());
17 |
18 | // Verify that our counter starts at 0.
19 | expect(find.text('0'), findsOneWidget);
20 | expect(find.text('1'), findsNothing);
21 |
22 | // Tap the '+' icon and trigger a frame.
23 | await tester.tap(find.byIcon(Icons.add));
24 | await tester.pump();
25 |
26 | // Verify that our counter has incremented.
27 | expect(find.text('0'), findsNothing);
28 | expect(find.text('1'), findsOneWidget);
29 | });
30 | }
31 |
--------------------------------------------------------------------------------
/lib/app/locator.config.dart:
--------------------------------------------------------------------------------
1 | // GENERATED CODE - DO NOT MODIFY BY HAND
2 |
3 | // **************************************************************************
4 | // InjectableConfigGenerator
5 | // **************************************************************************
6 |
7 | import 'package:get_it/get_it.dart';
8 | import 'package:injectable/injectable.dart';
9 | import 'package:stacked_services/stacked_services.dart';
10 |
11 | import '../core/services/thirdparty_services_module.dart';
12 |
13 | /// adds generated dependencies
14 | /// to the provided [GetIt] instance
15 |
16 | GetIt $initGetIt(
17 | GetIt get, {
18 | String environment,
19 | EnvironmentFilter environmentFilter,
20 | }) {
21 | final gh = GetItHelper(get, environment, environmentFilter);
22 | final thirdPartyServicesModule = _$ThirdPartyServicesModule();
23 | gh.lazySingleton(() => thirdPartyServicesModule.dialogService);
24 | gh.lazySingleton(
25 | () => thirdPartyServicesModule.navigationService);
26 | gh.lazySingleton(
27 | () => thirdPartyServicesModule.snackbarService);
28 | return get;
29 | }
30 |
31 | class _$ThirdPartyServicesModule extends ThirdPartyServicesModule {
32 | @override
33 | DialogService get dialogService => DialogService();
34 | @override
35 | NavigationService get navigationService => NavigationService();
36 | @override
37 | SnackbarService get snackbarService => SnackbarService();
38 | }
39 |
--------------------------------------------------------------------------------
/ios/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment this line to define a global platform for your project
2 | # platform :ios, '9.0'
3 |
4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true'
6 |
7 | project 'Runner', {
8 | 'Debug' => :debug,
9 | 'Profile' => :release,
10 | 'Release' => :release,
11 | }
12 |
13 | def flutter_root
14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
15 | unless File.exist?(generated_xcode_build_settings_path)
16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
17 | end
18 |
19 | File.foreach(generated_xcode_build_settings_path) do |line|
20 | matches = line.match(/FLUTTER_ROOT\=(.*)/)
21 | return matches[1].strip if matches
22 | end
23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
24 | end
25 |
26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
27 |
28 | flutter_ios_podfile_setup
29 |
30 | target 'Runner' do
31 | use_frameworks!
32 | use_modular_headers!
33 |
34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
35 | end
36 |
37 | post_install do |installer|
38 | installer.pods_project.targets.each do |target|
39 | flutter_additional_ios_build_settings(target)
40 | end
41 | end
42 |
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: the_parker
2 | description: A new Flutter project.
3 | version: 1.0.0+1
4 |
5 | environment:
6 | sdk: ">=2.2.2 <3.0.0"
7 | # sdk: ">=2.1.0 <3.0.0"
8 |
9 | dependencies:
10 | flutter:
11 | sdk: flutter
12 |
13 | cupertino_icons: ^0.1.2
14 | custom_radio_grouped_button: ^1.0.0
15 | eva_icons_flutter: ^2.0.0
16 | extended_navbar_scaffold: 1.0.2+1
17 | flare_flutter: ^2.0.6
18 | flutter_map: ^0.8.2
19 | flutter_vector_icons: ^0.3.0
20 | geolocator: ^6.2.0
21 | get_it: 5.0.6
22 | google_maps_flutter: ^1.2.0
23 | http: ^0.12.2
24 | injectable: 1.0.7
25 | mapbox_search: ^2.1.0
26 | mapbox_search_flutter: ^1.0.6+1
27 | stacked: 1.7.7
28 | stacked_hooks: 0.1.3+2
29 | stacked_services: 0.6.6
30 | user_location: ^0.1.3
31 |
32 | dev_dependencies:
33 | flutter_test:
34 | sdk: flutter
35 | build_runner: ^1.11.1
36 | injectable_generator: ^1.0.7
37 |
38 | dependency_overrides:
39 | flutter_map: ^0.8.2
40 |
41 | flutter:
42 | uses-material-design: true
43 |
44 | assets:
45 | - assets/
46 |
47 | fonts:
48 | - family: K2D
49 | fonts:
50 | - asset: assets/fonts/K2D-Light.ttf
51 | weight: 300
52 | - asset: assets/fonts/K2D-Regular.ttf
53 | weight: 400
54 | - asset: assets/fonts/K2D-Medium.ttf
55 | weight: 500
56 | - asset: assets/fonts/K2D-SemiBold.ttf
57 | weight: 600
58 | - asset: assets/fonts/K2D-Bold.ttf
59 | weight: 700
60 | - asset: assets/fonts/K2D-ExtraBold.ttf
61 | weight: 900
62 |
--------------------------------------------------------------------------------
/web/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | the_parker
30 |
31 |
32 |
33 |
36 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 |
12 | # IntelliJ related
13 | *.iml
14 | *.ipr
15 | *.iws
16 | .idea/
17 |
18 | # Visual Studio Code related
19 | .vscode/
20 |
21 | # Flutter/Dart/Pub related
22 | **/doc/api/
23 | .dart_tool/
24 | .flutter-plugins
25 | .packages
26 | .pub-cache/
27 | .pub/
28 | /build/
29 | APIKeys.dart
30 | lib/UI/resources/APIKeys.dart
31 | **/lib/**/resources/APIKeys.dart
32 |
33 | # Android related
34 | **/android/**/gradle-wrapper.jar
35 | **/android/.gradle
36 | **/android/captures/
37 | **/android/gradlew
38 | **/android/gradlew.bat
39 | **/android/local.properties
40 | **/android/**/GeneratedPluginRegistrant.java
41 |
42 | # iOS/XCode related
43 | **/ios/**/*.mode1v3
44 | **/ios/**/*.mode2v3
45 | **/ios/**/*.moved-aside
46 | **/ios/**/*.pbxuser
47 | **/ios/**/*.perspectivev3
48 | **/ios/**/*sync/
49 | **/ios/**/.sconsign.dblite
50 | **/ios/**/.tags*
51 | **/ios/**/.vagrant/
52 | **/ios/**/DerivedData/
53 | **/ios/**/Icon?
54 | **/ios/**/Pods/
55 | **/ios/**/.symlinks/
56 | **/ios/**/profile
57 | **/ios/**/xcuserdata
58 | **/ios/.generated/
59 | **/ios/Flutter/App.framework
60 | **/ios/Flutter/Flutter.framework
61 | **/ios/Flutter/Generated.xcconfig
62 | **/ios/Flutter/app.flx
63 | **/ios/Flutter/app.zip
64 | **/ios/Flutter/flutter_assets/
65 | **/ios/ServiceDefinitions.json
66 | **/ios/Runner/GeneratedPluginRegistrant.*
67 |
68 | # Exceptions to above rules.
69 | !**/ios/**/default.mode1v3
70 | !**/ios/**/default.mode2v3
71 | !**/ios/**/default.pbxuser
72 | !**/ios/**/default.perspectivev3
73 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
74 | lib/UI/resources/APIKeys.dart
75 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Theparker: A shared parking app for extra income :-)!
2 |
3 | ### Theparker is first open source(Flutter) shared parking app! (after my last theParker open source iOS App)
4 |
5 | ### I'll be using Provider + Get_it for State Management.
6 |
7 | ## MVVM(Model-View-(View)Model) Architecture.
8 |
9 | Theparker is the app build for iOS and Android using Flutter.
10 |
11 | It uses Firebase FireStore as Database and Firebase Storage.(Currently I'm planning to use static payment, no payment gateway will be added added anytime soon)
12 |
13 | ## FeatureS:
14 |
15 | | UI | Logic | Feature |
16 | | ------ | ------ | ------|
17 | | | |Live Parking Spots on Google Map
18 | | | | Login using Google.
19 | | ✔ | | Login Using mobile Number.
20 | | | | Upload Your parking Spot
21 | | | | Search Parking Space.
22 | | ✔ | |Login Using Email.
23 | | ✔ | ✔ |Intro Screens.
24 | | | | Check previous transactions.
25 | | | | Add my Cars.
26 | | | | Book Parking.
27 | | | | Upload parking Photos.
28 | | | | Get direction to the parking spot.
29 | | | | Call the spot owner.
30 | | | | See previous parking Spot Added.
31 | | | | Check previous Booking.
32 | | | | Local Notification.
33 | | | | Profile Editing.
34 | | | | Dark Mode
35 |
36 | ## Screenshots
37 |
38 | ### soon......
39 |
40 | ## Getting Started
41 |
42 | This project is a starting point for a Flutter application.
43 |
44 | A few resources to get you started if this is your first Flutter project:
45 |
46 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
47 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
48 |
49 | For help getting started with Flutter, view our
50 | [online documentation](https://flutter.dev/docs), which offers tutorials,
51 | samples, guidance on mobile development, and a full API reference.
52 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | the_parker
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | $(FLUTTER_BUILD_NAME)
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(FLUTTER_BUILD_NUMBER)
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UISupportedInterfaceOrientations
30 |
31 | UIInterfaceOrientationPortrait
32 | UIInterfaceOrientationLandscapeLeft
33 | UIInterfaceOrientationLandscapeRight
34 |
35 | UISupportedInterfaceOrientations~ipad
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationPortraitUpsideDown
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UIViewControllerBasedStatusBarAppearance
43 |
44 | NSLocationWhenInUseUsageDescription
45 | This app needs access to location when open.
46 | NSLocationAlwaysUsageDescription
47 | This app needs access to location when in the background.
48 |
49 |
50 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | def localProperties = new Properties()
2 | def localPropertiesFile = rootProject.file('local.properties')
3 | if (localPropertiesFile.exists()) {
4 | localPropertiesFile.withReader('UTF-8') { reader ->
5 | localProperties.load(reader)
6 | }
7 | }
8 |
9 | def flutterRoot = localProperties.getProperty('flutter.sdk')
10 | if (flutterRoot == null) {
11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12 | }
13 |
14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
15 | if (flutterVersionCode == null) {
16 | flutterVersionCode = '1'
17 | }
18 |
19 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
20 | if (flutterVersionName == null) {
21 | flutterVersionName = '1.0'
22 | }
23 |
24 | apply plugin: 'com.android.application'
25 | apply plugin: 'kotlin-android'
26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
27 |
28 | android {
29 | compileSdkVersion 30
30 |
31 | sourceSets {
32 | main.java.srcDirs += 'src/main/kotlin'
33 | }
34 |
35 | defaultConfig {
36 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
37 | applicationId "com.example.the_parker"
38 | minSdkVersion 16
39 | targetSdkVersion 30
40 | versionCode flutterVersionCode.toInteger()
41 | versionName flutterVersionName
42 | }
43 |
44 | buildTypes {
45 | release {
46 | // TODO: Add your own signing config for the release build.
47 | // Signing with the debug keys for now, so `flutter run --release` works.
48 | signingConfig signingConfigs.debug
49 | }
50 | }
51 | }
52 |
53 | flutter {
54 | source '../..'
55 | }
56 |
57 | dependencies {
58 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
59 | }
60 |
--------------------------------------------------------------------------------
/lib/UI/views/welcome/welcome_view.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:stacked/stacked.dart';
3 | import 'package:the_parker/ui/resources/ConstantMethods.dart';
4 | import 'package:the_parker/ui/views/login/login_view.dart';
5 | import 'package:the_parker/ui/widgets/LiquidSwipe/liquid_swipe.dart';
6 | import './welcome_viewmodel.dart';
7 | import 'IntroPage.dart';
8 |
9 | class WelcomeView extends StatefulWidget {
10 | @override
11 | _WelcomeViewState createState() => _WelcomeViewState();
12 | }
13 |
14 | class _WelcomeViewState extends State {
15 | @override
16 | Widget build(BuildContext context) {
17 | return ViewModelBuilder.reactive(
18 | viewModelBuilder: () => WelcomeViewModel(),
19 | builder: (context, model, child) => Scaffold(
20 | body: LiquidSwipe(
21 | pages: pages(context),
22 | widget: Positioned(
23 | bottom: MediaQuery.of(context).size.height * 0.12,
24 | width: MediaQuery.of(context).size.width,
25 | // left: MediaQuery.of(context).size.width/2 - 40,
26 | child: Align(
27 | alignment: Alignment.center,
28 | child: Hero(
29 | tag: 'title',
30 | transitionOnUserGestures: true,
31 | child: MaterialButton(
32 | height: 50,
33 | minWidth: MediaQuery.of(context).size.width - 100,
34 | elevation: 0,
35 | onPressed: () {
36 | kopenPage(context, LoginView());
37 | },
38 | color: Colors.white,
39 | child: Text(
40 | 'Login',
41 | style: TextStyle(
42 | fontSize: 20,
43 | fontWeight: FontWeight.bold,
44 | color: Colors.black,
45 | ),
46 | ),
47 | ),
48 | ),
49 | ),
50 | ),
51 | ),
52 | ),
53 | );
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/lib/UI/Widgets/FloatingAppbar.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:the_parker/ui/resources/ConstantMethods.dart';
3 |
4 | class FloatingAppbar extends StatelessWidget {
5 | FloatingAppbar({
6 | this.title,
7 | this.fontSize = 16,
8 | });
9 |
10 | final String title;
11 | final double fontSize;
12 |
13 | @override
14 | Widget build(BuildContext context) {
15 | return Positioned(
16 | top: 0,
17 | left: 5,
18 | right: 5,
19 | child: SafeArea(
20 | child: Row(
21 | children: [
22 | Hero(
23 | tag: 'backkk',
24 | transitionOnUserGestures: true,
25 | child: Card(
26 | elevation: 10,
27 | child: Container(
28 | height: 50,
29 | width: 50,
30 | child: RawMaterialButton(
31 | onPressed: () {
32 | kbackBtn(context);
33 | },
34 | child: Icon(
35 | Icons.arrow_back_ios,
36 | ),
37 | ),
38 | ),
39 | ),
40 | ),
41 | Expanded(
42 | child: Hero(
43 | tag: 'titleee',
44 | // transitionOnUserGestures: true,
45 | child: Card(
46 | elevation: 10,
47 | child: Container(
48 | height: 50,
49 | child: Center(
50 | child: Text(
51 | title,
52 | maxLines: 2,
53 | textAlign: TextAlign.center,
54 | overflow: TextOverflow.ellipsis,
55 | softWrap: true,
56 | style: ksubtitleStyle.copyWith(
57 | fontSize: fontSize,
58 | ),
59 | ),
60 | ),
61 | ),
62 | ),
63 | ),
64 | ),
65 | ],
66 | ),
67 | ),
68 | );
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/lib/UI/Resources/Resources.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/rendering.dart';
2 |
3 | class Kcolors {
4 | static const primaryDark = Color(0xff311B92);
5 | static const primary = Color(0xff9575CD);
6 |
7 | static const accent = Color(0xff7C4DFF);
8 | static const accentLight = Color(0xff651FFF);
9 | }
10 |
11 | class Kassets {
12 | static const parking = 'assets/parking.png';
13 | static const shakeHands = 'assets/shake_hands.png';
14 | static const userFriendly = 'assets/user_friendly.png';
15 | static const way = 'assets/way.png';
16 | static const group = 'assets/Group.png';
17 | }
18 |
19 | class Kstrings {
20 | //Welcome
21 | static const screen1_1 = 'Find Car Parking near you';
22 | static const screen1_2 = 'Just search in the maps where you want your car parking';
23 |
24 | static const screen2_1 = 'Give your parking for Extra Cash';
25 | static const screen2_2 = 'Share your location for users to see your parking location.';
26 |
27 | static const screen3_1 = 'User Friendly App ';
28 | static const screen3_2 = 'Select location and we will direct you there.';
29 |
30 | static const screen4_1 = 'Your Car is in good hands';
31 | static const screen4_2 = 'We park your car in one of our secure areas.';
32 |
33 | //Login
34 | static const registered = 'Registered?';
35 | static const not_registered = 'Not Registered?';
36 | static const login = 'Login';
37 | static const mobile = 'Mobile';
38 | static const register = 'Register';
39 | static const need_help = 'Need help?';
40 |
41 | static const email = 'Email';
42 | static const email_hint = 'you@example.com';
43 |
44 | static const password = 'Password';
45 | static const confirm_password = 'Confirm Password';
46 | static const password_hint = '*@*s*#ls';
47 |
48 | static const mobile_no = 'Mobile No';
49 | static const mobile_hint = '+9199xxxxxxxx';
50 |
51 | static const otp = 'OTP';
52 | static const otp_hint = '_ _ _ _ _ _';
53 | static const send_otp = 'Send OTP';
54 |
55 | //Forgot Password
56 | static const forgot_password = 'Reset';
57 | static const enter_registered_email =
58 | 'Enter Registered mail-id to recover your account';
59 | static const send_recovery_mail = 'Send recovery mail';
60 |
61 | }
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
13 |
17 |
21 |
26 |
30 |
31 |
32 |
33 |
34 |
35 |
37 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/ios/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - Flutter (1.0.0)
3 | - flutter_compass (0.0.1):
4 | - Flutter
5 | - FMDB (2.7.5):
6 | - FMDB/standard (= 2.7.5)
7 | - FMDB/standard (2.7.5)
8 | - geolocator (6.2.0):
9 | - Flutter
10 | - google_maps_flutter (0.0.1):
11 | - Flutter
12 | - GoogleMaps (< 3.10)
13 | - GoogleMaps (3.9.0):
14 | - GoogleMaps/Maps (= 3.9.0)
15 | - GoogleMaps/Base (3.9.0)
16 | - GoogleMaps/Maps (3.9.0):
17 | - GoogleMaps/Base
18 | - location (0.0.1):
19 | - Flutter
20 | - path_provider (0.0.1):
21 | - Flutter
22 | - sqflite (0.0.2):
23 | - Flutter
24 | - FMDB (>= 2.7.5)
25 | - user_location (0.0.1):
26 | - Flutter
27 |
28 | DEPENDENCIES:
29 | - Flutter (from `Flutter`)
30 | - flutter_compass (from `.symlinks/plugins/flutter_compass/ios`)
31 | - geolocator (from `.symlinks/plugins/geolocator/ios`)
32 | - google_maps_flutter (from `.symlinks/plugins/google_maps_flutter/ios`)
33 | - location (from `.symlinks/plugins/location/ios`)
34 | - path_provider (from `.symlinks/plugins/path_provider/ios`)
35 | - sqflite (from `.symlinks/plugins/sqflite/ios`)
36 | - user_location (from `.symlinks/plugins/user_location/ios`)
37 |
38 | SPEC REPOS:
39 | trunk:
40 | - FMDB
41 | - GoogleMaps
42 |
43 | EXTERNAL SOURCES:
44 | Flutter:
45 | :path: Flutter
46 | flutter_compass:
47 | :path: ".symlinks/plugins/flutter_compass/ios"
48 | geolocator:
49 | :path: ".symlinks/plugins/geolocator/ios"
50 | google_maps_flutter:
51 | :path: ".symlinks/plugins/google_maps_flutter/ios"
52 | location:
53 | :path: ".symlinks/plugins/location/ios"
54 | path_provider:
55 | :path: ".symlinks/plugins/path_provider/ios"
56 | sqflite:
57 | :path: ".symlinks/plugins/sqflite/ios"
58 | user_location:
59 | :path: ".symlinks/plugins/user_location/ios"
60 |
61 | SPEC CHECKSUMS:
62 | Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c
63 | flutter_compass: cbbd285cea1584c7ac9c4e0c3e1f17cbea55e855
64 | FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
65 | geolocator: f5e3de65e241caba7ce3e8a618803387bda73384
66 | google_maps_flutter: c7f9c73576de1fbe152a227bfd6e6c4ae8088619
67 | GoogleMaps: 4b5346bddfe6911bb89155d43c903020170523ac
68 | location: 3a2eed4dd2fab25e7b7baf2a9efefe82b512d740
69 | path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c
70 | sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
71 | user_location: ec382950d42014e9d796513cb4a83de2e643a477
72 |
73 | PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c
74 |
75 | COCOAPODS: 1.10.1
76 |
--------------------------------------------------------------------------------
/lib/UI/views/welcome/IntroPage.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:the_parker/ui/resources/resources.dart';
3 |
4 | List pages(BuildContext context) {
5 | return [
6 | intro(context, Kstrings.screen1_1, Kstrings.screen1_2, Kassets.way,
7 | Color(0xffFFDA56)),
8 | intro(context, Kstrings.screen2_1, Kstrings.screen2_1, Kassets.parking,
9 | Color(0xff2CE7E7)),
10 | intro(context, Kstrings.screen3_1, Kstrings.screen3_2, Kassets.userFriendly,
11 | Color(0xff3ABA68)),
12 | intro(context, Kstrings.screen4_1, Kstrings.screen4_2, Kassets.shakeHands,
13 | Color(0xffED5575)),
14 | ];
15 | }
16 |
17 | Container intro(BuildContext context, String heading, String subTitle,
18 | String imageAsset, Color color) {
19 | return Container(
20 | child: Scaffold(
21 | backgroundColor: color,
22 | body: SafeArea(
23 | child: Column(
24 | crossAxisAlignment: CrossAxisAlignment.center,
25 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
26 | children: [
27 | // SizedBox(height: 10,),
28 | Container(
29 | padding:
30 | EdgeInsets.only(bottom: 10, left: 20, right: 20, top: 30),
31 | child: Center(
32 | child: Text(
33 | heading,
34 | textAlign: TextAlign.center,
35 | style: TextStyle(
36 | color: Colors.white,
37 | fontSize: 32,
38 | fontWeight: FontWeight.w900,
39 | ),
40 | ),
41 | ),
42 | ),
43 | // SizedBox(
44 | // height: 10,
45 | // ),
46 | Image.asset(
47 | imageAsset,
48 | width: MediaQuery.of(context).size.width - 100,
49 | alignment: Alignment.center,
50 | ),
51 | SizedBox(
52 | height: 10,
53 | ),
54 | Container(
55 | padding:
56 | EdgeInsets.only(bottom: 20, left: 20, right: 20, top: 10),
57 | child: Text(
58 | subTitle,
59 | textAlign: TextAlign.center,
60 | style: TextStyle(
61 | color: Colors.white70,
62 | fontSize: 16.0,
63 | fontWeight: FontWeight.w500),
64 | ),
65 | ),
66 | ],
67 | ),
68 | ),
69 | ),
70 | );
71 | }
72 |
--------------------------------------------------------------------------------
/lib/UI/Widgets/ProfileWidget.dart:
--------------------------------------------------------------------------------
1 | import 'package:eva_icons_flutter/eva_icons_flutter.dart';
2 | import 'package:flutter/material.dart';
3 |
4 | class ProfileWidget extends StatelessWidget {
5 | final double currentProfilePercent;
6 |
7 | final Function(bool) animateProfile;
8 |
9 | final bool isProfileOpen;
10 |
11 | final Function(DragUpdateDetails) onVerticalDragUpdate;
12 |
13 | final Function() onPanDown;
14 |
15 | const ProfileWidget(
16 | {Key key,
17 | this.currentProfilePercent,
18 | this.animateProfile,
19 | this.isProfileOpen,
20 | this.onVerticalDragUpdate,
21 | this.onPanDown})
22 | : super(key: key);
23 |
24 | @override
25 | Widget build(BuildContext context) {
26 | return Positioned(
27 | left: 25,
28 | top: (MediaQuery.of(context).size.height) * 0.75 * currentProfilePercent - 0.5,
29 | child: GestureDetector(
30 | onTap: () {
31 | animateProfile(!isProfileOpen);
32 | },
33 | onPanDown: (_) => onPanDown,
34 | onVerticalDragUpdate: onVerticalDragUpdate,
35 | onVerticalDragEnd: (_) {
36 | _dispatchProfileOffset();
37 | },
38 | child: Container(
39 | height: 75 - 25 * currentProfilePercent,
40 | width: 50,
41 | decoration: BoxDecoration(
42 | color: Theme.of(context).canvasColor,
43 | borderRadius: BorderRadius.only(
44 | bottomLeft: Radius.circular(50),
45 | bottomRight: Radius.circular(50),
46 | ),
47 | ),
48 | child: Stack(
49 | children: [
50 | Positioned(
51 | bottom: 0,
52 | left: 0,
53 | right: 0,
54 | child: CircleAvatar(
55 | child: Icon(
56 | EvaIcons.person,
57 | semanticLabel: 'Profile',
58 | ),
59 | ),
60 | ),
61 | ],
62 | ),
63 | ),
64 | ),
65 | );
66 | }
67 |
68 | /// dispatch Search state
69 | ///
70 | /// handle it by [isProfileOpen] and [currentProfilePercent]
71 | void _dispatchProfileOffset() {
72 | if (!isProfileOpen) {
73 | if (currentProfilePercent < 0.3) {
74 | animateProfile(false);
75 | } else {
76 | animateProfile(true);
77 | }
78 | } else {
79 | if (currentProfilePercent > 0.6) {
80 | animateProfile(true);
81 | } else {
82 | animateProfile(false);
83 | }
84 | }
85 | }
86 | }
87 |
--------------------------------------------------------------------------------
/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:provider/provider.dart';
3 | import 'package:the_parker/ui/views/welcome/welcome_view.dart';
4 |
5 | void main() {
6 | Provider.debugCheckInvalidValueType = null;
7 | runApp(MyApp());
8 | }
9 | // TODO: https://www.developerlibs.com/2018/08/flutter-how-can-draw-route-on-google.html?m=1 (Link for Distance and Direction)
10 |
11 | class MyApp extends StatefulWidget {
12 | @override
13 | _MyAppState createState() => _MyAppState();
14 | }
15 |
16 | class _MyAppState extends State {
17 | bool darkMode = false;
18 |
19 | @override
20 | Widget build(BuildContext context) {
21 | return MaterialApp(
22 | title: 'theParker',
23 | theme: darkMode
24 | ? ThemeData(
25 | fontFamily: 'K2D',
26 | pageTransitionsTheme: PageTransitionsTheme(builders: {
27 | TargetPlatform.android: CupertinoPageTransitionsBuilder(),
28 | TargetPlatform.iOS: CupertinoPageTransitionsBuilder(),
29 | }),
30 | // primaryColor: Kcolors.primary,
31 | // primaryColorDark: Kcolors.primaryDark,
32 | // primarySwatch: Colors.deepOrange,
33 | primaryColor: Colors.black,
34 | brightness: Brightness.dark,
35 | accentColor: Colors.black,
36 | // canvasColor: Colors.white12,
37 | )
38 | : ThemeData(
39 | fontFamily: 'K2D',
40 | pageTransitionsTheme: PageTransitionsTheme(builders: {
41 | TargetPlatform.android: CupertinoPageTransitionsBuilder(),
42 | TargetPlatform.iOS: CupertinoPageTransitionsBuilder(),
43 | }),
44 | // primaryColor: Kcolors.primary,
45 | // primaryColorDark: Kcolors.primaryDark,
46 | // primarySwatch: Colors.deepOrange,
47 | primaryColor: Colors.white,
48 | brightness: Brightness.light,
49 | accentColor: Colors.white,
50 | ),
51 | // darkTheme: ThemeData(
52 | // fontFamily: 'K2D',
53 | // pageTransitionsTheme: PageTransitionsTheme(builders: {
54 | // TargetPlatform.android: CupertinoPageTransitionsBuilder(),
55 | // TargetPlatform.iOS: CupertinoPageTransitionsBuilder(),
56 | // }),
57 | // primaryColor: Kcolors.primary,
58 | // // primaryColorDark: Kcolors.primaryDark,
59 | // // primarySwatch: Colors.deepOrange,
60 | // brightness: Brightness.dark,
61 | // accentColor: Colors.black,
62 | // canvasColor: Colors.black,
63 | // ),
64 | home: WelcomeView(),
65 | );
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/lib/UI/Resources/ConstantMethods.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/cupertino.dart';
2 | import 'package:flutter/material.dart';
3 |
4 | kbackBtn(BuildContext context) {
5 | Navigator.of(context).pop();
6 | }
7 |
8 | kopenPage(BuildContext context, Widget page) {
9 | return Navigator.push(
10 | context,
11 | MaterialPageRoute(
12 | builder: (BuildContext context) => page,
13 | ),
14 | );
15 | }
16 |
17 | Widget kBackBtn = Icon(
18 | Icons.arrow_back_ios,
19 | // color: Colors.black54,
20 | );
21 |
22 | var kTextFieldDecoration = InputDecoration(
23 | border: OutlineInputBorder(
24 | borderRadius: BorderRadius.circular(16),
25 | ),
26 | labelStyle: ksubtitleStyle.copyWith(
27 | color: Colors.black,
28 | ),
29 | focusedBorder: OutlineInputBorder(
30 | borderSide: BorderSide(
31 | color: Colors.black,
32 | width: 2,
33 | style: BorderStyle.solid,
34 | ),
35 | borderRadius: BorderRadius.circular(18),
36 | ),
37 | hintStyle: TextStyle(height: 1.5, fontWeight: FontWeight.w300),
38 | contentPadding: EdgeInsets.symmetric(vertical: 15.0, horizontal: 20.0),
39 | );
40 |
41 | var kTextFieldDecorationAddress = InputDecoration(
42 | labelStyle: ksubtitleStyle.copyWith(
43 | color: Colors.black,
44 | ),
45 | focusedBorder: OutlineInputBorder(
46 | borderSide: BorderSide(
47 | color: Colors.black,
48 | width: 2,
49 | style: BorderStyle.solid,
50 | ),
51 | borderRadius: BorderRadius.circular(10),
52 | ),
53 | border: OutlineInputBorder(
54 | borderRadius: BorderRadius.circular(5),
55 | ),
56 | hintStyle: TextStyle(
57 | height: 1.5,
58 | fontWeight: FontWeight.w300,
59 | ),
60 | contentPadding: EdgeInsets.symmetric(
61 | vertical: 20.0,
62 | horizontal: 20.0,
63 | ),
64 | );
65 |
66 | TextStyle ktitleStyle = TextStyle(fontWeight: FontWeight.w800);
67 | TextStyle ksubtitleStyle = TextStyle(fontWeight: FontWeight.w600);
68 |
69 | kopenPageBottom(BuildContext context, Widget page) {
70 | Navigator.of(context).push(
71 | CupertinoPageRoute(
72 | fullscreenDialog: true,
73 | builder: (BuildContext context) => page,
74 | ),
75 | );
76 | }
77 |
78 | SnackBar ksnackBar(BuildContext context, String message) {
79 | return SnackBar(
80 | content: Text(
81 | message,
82 | textAlign: TextAlign.center,
83 | ),
84 | backgroundColor: Theme.of(context).primaryColor,
85 | );
86 | }
87 |
88 | ShapeBorder kRoundedButtonShape = RoundedRectangleBorder(
89 | borderRadius: BorderRadius.all(Radius.circular(50)),
90 | );
91 |
92 | ShapeBorder kBackButtonShape = RoundedRectangleBorder(
93 | borderRadius: BorderRadius.only(
94 | topRight: Radius.circular(30),
95 | ),
96 | );
97 |
--------------------------------------------------------------------------------
/lib/UI/Widgets/LiquidSwipe/Animation_Gesture/animated_page_dragger.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 | import 'dart:ui';
3 |
4 | import 'package:flutter/material.dart';
5 |
6 | import '../Constants/constants.dart';
7 | import '../liquid_swipe.dart';
8 |
9 | /// This class provides the animation controller
10 | /// used when then user stops dragging and page
11 | /// reveal is not completed.
12 |
13 | class AnimatedPageDragger {
14 | final SlideDirection slideDirection;
15 |
16 | //This variable tells that whether we have to open or close the page reveal.
17 | final TransitionGoal transitionGoal;
18 |
19 | //Animation controller
20 | AnimationController completionAnimationController;
21 |
22 | //Constructor
23 | AnimatedPageDragger({
24 | this.slideDirection,
25 | this.transitionGoal,
26 | double slidePercent,
27 | StreamController slideUpdateStream,
28 | TickerProvider vsync,
29 | }) {
30 | final startSlidePercent = slidePercent;
31 | double endSlidePercent;
32 | Duration duration;
33 |
34 | //We have to complete the page reveal
35 | if (transitionGoal == TransitionGoal.open) {
36 | endSlidePercent = 1.0;
37 |
38 | final slideRemaining = 1.0 - slidePercent;
39 | //Standard value take for drag velocity to avoid complex calculations.
40 | duration = Duration(
41 | milliseconds: (slideRemaining / PERCENT_PER_MILLISECOND).round());
42 | }
43 | //We have to close the page reveal
44 | else {
45 | endSlidePercent = 0.0;
46 |
47 | duration = Duration(
48 | milliseconds: (slidePercent / PERCENT_PER_MILLISECOND).round());
49 | }
50 |
51 | //Adding listener to animation controller
52 | //Also value to animation controller vary from 0.0 to 1.0 according to duration.
53 | completionAnimationController = AnimationController(
54 | duration: duration, vsync: vsync)
55 | ..addListener(() {
56 | final slidePercent = lerpDouble(startSlidePercent, endSlidePercent,
57 | completionAnimationController.value);
58 |
59 | //Adding to slide update stream
60 | slideUpdateStream.add(
61 | SlideUpdate(slideDirection, slidePercent, UpdateType.animating));
62 | })
63 | ..addStatusListener((AnimationStatus status) {
64 | //When animation has done executing
65 | if (status == AnimationStatus.completed) {
66 | //Adding to slide update stream
67 | slideUpdateStream.add(SlideUpdate(
68 | slideDirection, slidePercent, UpdateType.doneAnimating));
69 | }
70 | });
71 | }
72 |
73 | //This method is used to run animation Controller
74 | void run() {
75 | completionAnimationController.forward(from: 0.0);
76 | }
77 |
78 | //This method is used to dispose animation controller
79 | void dispose() {
80 | completionAnimationController.dispose();
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/lib/UI/Widgets/LiquidSwipe/Animation_Gesture/page_dragger.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 | import 'package:flutter/material.dart';
3 | import 'package:the_parker/ui/widgets/LiquidSwipe/Constants/constants.dart';
4 | import '../liquid_swipe.dart';
5 |
6 | /// This class is used to get user gesture and work according to it.
7 |
8 | class PageDragger extends StatefulWidget {
9 | final double fullTransitionPX;
10 |
11 | //Stream controller
12 | final StreamController slideUpdateStream;
13 |
14 | //Constructor
15 | PageDragger({
16 | this.slideUpdateStream,
17 | this.fullTransitionPX = FULL_TARNSITION_PX, //see Constants file
18 | }) : assert(fullTransitionPX != null);
19 |
20 | @override
21 | _PageDraggerState createState() => _PageDraggerState();
22 | }
23 |
24 | class _PageDraggerState extends State {
25 | //Variables
26 | Offset dragStart;
27 | SlideDirection slideDirection;
28 | double slidePercent = 0.0;
29 |
30 | // This methods executes when user starts dragging.
31 | onDragStart(DragStartDetails details) {
32 | dragStart = details.globalPosition;
33 | }
34 |
35 | // This methods executes while user is dragging.
36 | onDragUpdate(DragUpdateDetails details) {
37 | if (dragStart != null) {
38 | //Getting new position details
39 | final newPosition = details.globalPosition;
40 | //Change in position in x
41 | final dx = dragStart.dx - newPosition.dx;
42 |
43 | //predicting slide direction
44 | if (dx > 0.0) {
45 | slideDirection = SlideDirection.rightToLeft;
46 | } else if (dx < 0.0) {
47 | slideDirection = SlideDirection.leftToRight;
48 | } else {
49 | slideDirection = SlideDirection.none;
50 | }
51 |
52 | //predicting slide percent
53 | if (slideDirection != SlideDirection.none) {
54 | //clamp method is used to clamp the value of slidePercent from 0.0 to 1.0, after 1.0 it set to 1.0
55 | slidePercent = (dx / widget.fullTransitionPX).abs().clamp(0.0, 1.0);
56 | } else {
57 | slidePercent = 0.0;
58 | }
59 |
60 | // Adding to slideUpdateStream
61 | widget.slideUpdateStream
62 | .add(SlideUpdate(slideDirection, slidePercent, UpdateType.dragging));
63 | }
64 | }
65 |
66 | // This method executes when user ends dragging.
67 | onDragEnd(DragEndDetails details) {
68 | // Adding to slideUpdateStream
69 | widget.slideUpdateStream.add(SlideUpdate(
70 | SlideDirection.none, slidePercent, UpdateType.doneDragging));
71 |
72 | //Making dragStart to null for the reallocation
73 | dragStart = null;
74 | }
75 |
76 | @override
77 | Widget build(BuildContext context) {
78 | //Gesture Detector for horizontal drag
79 | return GestureDetector(
80 | onHorizontalDragStart: onDragStart,
81 | onHorizontalDragUpdate: onDragUpdate,
82 | onHorizontalDragEnd: onDragEnd,
83 | );
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-App-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-App-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-App-29x29@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-App-29x29@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-App-29x29@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-App-40x40@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "Icon-App-40x40@3x.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-App-60x60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "Icon-App-60x60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "20x20",
59 | "idiom" : "ipad",
60 | "filename" : "Icon-App-20x20@1x.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "20x20",
65 | "idiom" : "ipad",
66 | "filename" : "Icon-App-20x20@2x.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "Icon-App-29x29@1x.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "29x29",
77 | "idiom" : "ipad",
78 | "filename" : "Icon-App-29x29@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "Icon-App-40x40@1x.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "40x40",
89 | "idiom" : "ipad",
90 | "filename" : "Icon-App-40x40@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "Icon-App-76x76@1x.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "76x76",
101 | "idiom" : "ipad",
102 | "filename" : "Icon-App-76x76@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "83.5x83.5",
107 | "idiom" : "ipad",
108 | "filename" : "Icon-App-83.5x83.5@2x.png",
109 | "scale" : "2x"
110 | },
111 | {
112 | "size" : "1024x1024",
113 | "idiom" : "ios-marketing",
114 | "filename" : "Icon-App-1024x1024@1x.png",
115 | "scale" : "1x"
116 | }
117 | ],
118 | "info" : {
119 | "version" : 1,
120 | "author" : "xcode"
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/lib/UI/views/forgot_password/forgot_password_view.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:stacked/stacked.dart';
3 | import 'package:the_parker/ui/resources/ConstantMethods.dart';
4 | import 'package:the_parker/ui/resources/resources.dart';
5 | import 'package:the_parker/ui/widgets/TopBar.dart';
6 | import './forgot_password_viewmodel.dart';
7 |
8 | class ForgotPasswordView extends StatefulWidget {
9 | @override
10 | _ForgotPasswordViewState createState() => _ForgotPasswordViewState();
11 | }
12 |
13 | class _ForgotPasswordViewState extends State {
14 | @override
15 | Widget build(BuildContext context) {
16 | return ViewModelBuilder.reactive(
17 | builder: (context, model, child) => Scaffold(
18 | appBar: TopBar(
19 | child: kBackBtn,
20 | onPressed: () {
21 | kbackBtn(context);
22 | },
23 | title: Kstrings.forgot_password,
24 | ),
25 | body: Padding(
26 | padding: const EdgeInsets.only(
27 | bottom: 25.0, left: 25.0, right: 25.0, top: 10),
28 | child: Column(
29 | crossAxisAlignment: CrossAxisAlignment.start,
30 | children: [
31 | Padding(
32 | padding: const EdgeInsets.only(
33 | left: 5.0,
34 | right: 5.0,
35 | ),
36 | child: Text(
37 | Kstrings.enter_registered_email,
38 | // textAlign: TextAlign.center,
39 | style: ktitleStyle,
40 | ),
41 | ),
42 | SizedBox(
43 | height: 15,
44 | ),
45 | TextField(
46 | obscureText: true,
47 | onChanged: (email) {},
48 | keyboardType: TextInputType.emailAddress,
49 | style: TextStyle(fontSize: 18, fontWeight: FontWeight.w500),
50 | decoration: kTextFieldDecoration.copyWith(
51 | hintText: Kstrings.email_hint,
52 | labelText: Kstrings.email,
53 | ),
54 | ),
55 | SizedBox(
56 | height: 15,
57 | ),
58 | Container(
59 | width: MediaQuery.of(context).size.width,
60 | child: Column(
61 | crossAxisAlignment: CrossAxisAlignment.end,
62 | children: [
63 | FloatingActionButton.extended(
64 | heroTag: 'needHelp',
65 | label: Text(
66 | Kstrings.send_recovery_mail,
67 | style: ktitleStyle,
68 | ),
69 | onPressed: () {
70 | //Forget Password Logic
71 | // kopenPage(context, ForgotPasswordPage());
72 | },
73 | // height: 40,
74 | ),
75 | ],
76 | ),
77 | ),
78 | ],
79 | ),
80 | ),
81 | ),
82 | viewModelBuilder: () => ForgotPasswordViewModel(),
83 | );
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/lib/UI/Widgets/TopBar.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:the_parker/ui/resources/ConstantMethods.dart';
3 |
4 | class TopBar extends StatefulWidget implements PreferredSizeWidget {
5 | final String title;
6 | final Widget child;
7 | final Function onPressed;
8 | final Function onTitleTapped;
9 |
10 | @override
11 | final Size preferredSize;
12 |
13 | TopBar(
14 | {@required this.title,
15 | @required this.child,
16 | @required this.onPressed,
17 | this.onTitleTapped})
18 | : preferredSize = Size.fromHeight(60.0);
19 |
20 | @override
21 | _TopBarState createState() => _TopBarState();
22 | }
23 |
24 | class _TopBarState extends State {
25 | @override
26 | Widget build(BuildContext context) {
27 | return SafeArea(
28 | child: Column(
29 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
30 | children: [
31 | // SizedBox(height: 30,),
32 | Row(
33 | mainAxisSize: MainAxisSize.max,
34 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
35 | children: [
36 | Hero(
37 | tag: 'topBarBtn',
38 | child: Container(
39 | // elevation: 10,
40 | // shape: kBackButtonShape,
41 | child: MaterialButton(
42 | height: 50,
43 | minWidth: 50,
44 | // elevation: 10,
45 | shape: kBackButtonShape,
46 | onPressed: widget.onPressed,
47 | child: widget.child,
48 | ),
49 | ),
50 | ),
51 | // SizedBox(
52 | // width: 50,
53 | // ),
54 | Hero(
55 | tag: 'title',
56 | transitionOnUserGestures: true,
57 | child: Card(
58 | // color: Theme.of(context).cardColor.withOpacity(0.3),
59 | elevation: 5,
60 | shape: RoundedRectangleBorder(
61 | borderRadius: BorderRadius.only(
62 | // bottomLeft: Radius.circular(30),
63 | ),
64 | ),
65 | child: InkWell(
66 | onTap: widget.onTitleTapped,
67 | child: Container(
68 | width: MediaQuery.of(context).size.width / 1.5,
69 | height: 50,
70 | child: Align(
71 | alignment: Alignment.centerLeft,
72 | child: Padding(
73 | padding: const EdgeInsets.only(left: 20),
74 | child: FittedBox(
75 | fit: BoxFit.fitWidth,
76 | child: Text(
77 | widget.title,
78 | style: TextStyle(
79 | fontWeight: FontWeight.bold,
80 | fontSize: 25,
81 | // color: Colors.black54,
82 | ),
83 | ),
84 | ),
85 | ),
86 | ),
87 | ),
88 | ),
89 | ),
90 | )
91 | ],
92 | ),
93 | ],
94 | ),
95 | );
96 | }
97 | }
98 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
44 |
54 |
56 |
62 |
63 |
64 |
65 |
66 |
67 |
73 |
75 |
81 |
82 |
83 |
84 |
86 |
87 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/.flutter-plugins-dependencies:
--------------------------------------------------------------------------------
1 | {"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"flutter_compass","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_compass-0.3.7/","dependencies":[]},{"name":"geolocator","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/geolocator-6.2.0/","dependencies":[]},{"name":"google_maps_flutter","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/google_maps_flutter-1.2.0/","dependencies":[]},{"name":"location","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/location-3.2.4/","dependencies":[]},{"name":"path_provider","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-1.6.27/","dependencies":[]},{"name":"sqflite","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite-1.3.2+3/","dependencies":[]},{"name":"user_location","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/user_location-0.1.3/","dependencies":["location","flutter_compass"]}],"android":[{"name":"flutter_compass","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_compass-0.3.7/","dependencies":[]},{"name":"flutter_plugin_android_lifecycle","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_plugin_android_lifecycle-1.0.11/","dependencies":[]},{"name":"geolocator","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/geolocator-6.2.0/","dependencies":[]},{"name":"google_maps_flutter","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/google_maps_flutter-1.2.0/","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"location","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/location-3.2.4/","dependencies":[]},{"name":"path_provider","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-1.6.27/","dependencies":[]},{"name":"sqflite","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite-1.3.2+3/","dependencies":[]},{"name":"user_location","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/user_location-0.1.3/","dependencies":["location","flutter_compass"]}],"macos":[{"name":"location","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/location-3.2.4/","dependencies":[]},{"name":"path_provider_macos","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-0.0.4+8/","dependencies":[]},{"name":"sqflite","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/sqflite-1.3.2+3/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-0.0.1+2/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-0.0.4+3/","dependencies":[]}],"web":[{"name":"geolocator_web","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/geolocator_web-1.0.0/","dependencies":[]},{"name":"location_web","path":"/Users/ketanchoyal/Development/flutter/.pub-cache/hosted/pub.dartlang.org/location_web-1.0.1/","dependencies":[]}]},"dependencyGraph":[{"name":"flutter_compass","dependencies":[]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"geolocator","dependencies":["geolocator_web"]},{"name":"geolocator_web","dependencies":[]},{"name":"google_maps_flutter","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"location","dependencies":["location_web"]},{"name":"location_web","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"sqflite","dependencies":[]},{"name":"user_location","dependencies":["location","flutter_compass"]}],"date_created":"2021-02-16 20:48:45.506297","version":"1.26.0-17.3.pre"}
--------------------------------------------------------------------------------
/lib/UI/views/parking_spot_detail/parking_spot_detail_view.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:stacked/stacked.dart';
3 | import './parking_spot_detail_viewmodel.dart';
4 | import 'package:eva_icons_flutter/eva_icons_flutter.dart';
5 | import 'package:flutter/cupertino.dart';
6 | import 'package:flutter/widgets.dart';
7 | import 'package:the_parker/ui/resources/ConstantMethods.dart';
8 | import 'package:the_parker/ui/widgets/FloatingAppbar.dart';
9 |
10 | class ParkingSpotDetailView extends StatefulWidget {
11 | ParkingSpotDetailView({Key key}) : super(key: key);
12 |
13 | @override
14 | _ParkingSpotDetailViewState createState() => _ParkingSpotDetailViewState();
15 | }
16 |
17 | class _ParkingSpotDetailViewState extends State {
18 | int currentSelectedSegment = 1;
19 |
20 | @override
21 | Widget build(BuildContext context) {
22 | return ViewModelBuilder.reactive(
23 | viewModelBuilder: () => ParkingSpotDetailViewModel(),
24 | builder: (context, model, child) {
25 | return Scaffold(
26 | floatingActionButtonLocation:
27 | FloatingActionButtonLocation.centerFloat,
28 | floatingActionButton: FloatingActionButton.extended(
29 | icon: Icon(
30 | EvaIcons.arrowForward,
31 | ),
32 | label: Text(
33 | 'Next',
34 | style: ksubtitleStyle,
35 | ),
36 | onPressed: () {},
37 | ),
38 | body: Stack(
39 | children: [
40 | Positioned(
41 | top: MediaQuery.of(context).size.height * 0.12,
42 | left: 15,
43 | right: 15,
44 | bottom: 30,
45 | child: Column(
46 | crossAxisAlignment: CrossAxisAlignment.stretch,
47 | children: [
48 | Padding(
49 | padding: const EdgeInsets.symmetric(
50 | vertical: 10,
51 | ),
52 | child: Text(
53 | "Choose the type of your Parking Spot",
54 | style: ksubtitleStyle.copyWith(fontSize: 18),
55 | ),
56 | ),
57 | CupertinoSlidingSegmentedControl(
58 | children: {
59 | 0: Text(
60 | 'Car Port',
61 | style: ktitleStyle,
62 | ),
63 | 1: Text(
64 | 'Driveway',
65 | style: ktitleStyle,
66 | ),
67 | 2: Text(
68 | 'Garage',
69 | style: ktitleStyle,
70 | ),
71 | 3: Text(
72 | 'Other',
73 | style: ktitleStyle,
74 | ),
75 | },
76 | onValueChanged: (newValue) {
77 | setState(() {
78 | currentSelectedSegment = newValue;
79 | });
80 | },
81 | groupValue: currentSelectedSegment,
82 | ),
83 | Padding(
84 | padding: const EdgeInsets.symmetric(
85 | vertical: 15,
86 | ),
87 | child: Text(
88 | "How many parking spots do you want to rent?",
89 | style: ksubtitleStyle.copyWith(fontSize: 18),
90 | ),
91 | ),
92 | TextField(
93 | obscureText: true,
94 | onChanged: (email) {},
95 | keyboardType: TextInputType.emailAddress,
96 | style: TextStyle(
97 | fontSize: 18, fontWeight: FontWeight.w500),
98 | decoration: kTextFieldDecoration.copyWith(
99 | hintText: "No of parking spots",
100 | labelText: "No of parking spots",
101 | ),
102 | ),
103 | Padding(
104 | padding: const EdgeInsets.symmetric(
105 | vertical: 15,
106 | ),
107 | child: Text(
108 | "Additional Features:",
109 | style: ksubtitleStyle.copyWith(fontSize: 18),
110 | ),
111 | ),
112 | Row(
113 | children: [
114 | // Icon(Icons.)
115 | ],
116 | )
117 | ],
118 | ),
119 | ),
120 | FloatingAppbar(
121 | fontSize: 20,
122 | title: 'Parking Details',
123 | ),
124 | ],
125 | ),
126 | );
127 | });
128 | }
129 | }
130 |
--------------------------------------------------------------------------------
/lib/UI/views/mobile_no_login/mobile_no_login_view.dart:
--------------------------------------------------------------------------------
1 | import 'package:eva_icons_flutter/eva_icons_flutter.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:stacked/stacked.dart';
4 | import 'package:the_parker/ui/resources/ConstantMethods.dart';
5 | import 'package:the_parker/ui/resources/resources.dart';
6 | import 'package:the_parker/ui/widgets/TopBar.dart';
7 | import './mobile_no_login_viewmodel.dart';
8 |
9 | class MobileNoLoginView extends StatefulWidget {
10 | @override
11 | _MobileNoLoginViewState createState() => _MobileNoLoginViewState();
12 | }
13 |
14 | class _MobileNoLoginViewState extends State {
15 | bool isEnabled = true;
16 | @override
17 | Widget build(BuildContext context) {
18 | return ViewModelBuilder.reactive(
19 | builder: (context, model, child) => Scaffold(
20 | resizeToAvoidBottomInset: false,
21 | appBar: TopBar(
22 | title: Kstrings.mobile,
23 | child: kBackBtn,
24 | onPressed: () {
25 | Navigator.pop(context);
26 | },
27 | ),
28 | floatingActionButton: Row(
29 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
30 | children: [
31 | Padding(
32 | padding: const EdgeInsets.only(left: 31),
33 | child: FloatingActionButton.extended(
34 | heroTag: 'abc',
35 | label: Container(),
36 | onPressed: () {
37 | Navigator.pop(context);
38 | },
39 | icon: Padding(
40 | padding: const EdgeInsets.only(left: 15),
41 | child: Icon(EvaIcons.emailOutline),
42 | )),
43 | ),
44 | FloatingActionButton.extended(
45 | label: Text(
46 | 'Login',
47 | style: ktitleStyle,
48 | ),
49 | onPressed: () {
50 | Navigator.pop(context);
51 | },
52 | icon: Icon(EvaIcons.logIn)),
53 | ],
54 | ),
55 | body: SingleChildScrollView(
56 | child: Column(
57 | children: [
58 | Hero(
59 | tag: 'imageee',
60 | child: Image.asset(
61 | Kassets.group,
62 | width: MediaQuery.of(context).size.width - 50,
63 | alignment: Alignment.center,
64 | ),
65 | ),
66 | SafeArea(
67 | child: Padding(
68 | padding: EdgeInsets.only(left: 20, right: 20, top: 10),
69 | child: Column(
70 | // mainAxisSize: MainAxisSize.min,
71 | // mainAxisAlignment: MainAxisAlignment.spaceBetween,
72 | children: [
73 | SizedBox(
74 | height: 10,
75 | ),
76 | TextField(
77 | enabled: isEnabled,
78 | onChanged: (email) {},
79 | keyboardType: TextInputType.number,
80 | style: TextStyle(
81 | fontSize: 18, fontWeight: FontWeight.w500),
82 | decoration: kTextFieldDecoration.copyWith(
83 | hintText: Kstrings.mobile_hint,
84 | labelText: Kstrings.mobile_no,
85 | ),
86 | ),
87 | SizedBox(
88 | height: 15,
89 | ),
90 | TextField(
91 | enabled: !isEnabled,
92 | onChanged: (password) {},
93 | keyboardType: TextInputType.number,
94 | style: TextStyle(
95 | fontSize: 18, fontWeight: FontWeight.w500),
96 | decoration: kTextFieldDecoration.copyWith(
97 | hintText: Kstrings.otp_hint,
98 | labelText: Kstrings.otp,
99 | ),
100 | ),
101 | SizedBox(
102 | height: 15,
103 | ),
104 | // Hero(
105 | // tag: 'otpForget',
106 | // child:
107 | Container(
108 | height: 50,
109 | width: MediaQuery.of(context).size.width,
110 | child: Align(
111 | alignment: Alignment.centerRight,
112 | child: FloatingActionButton.extended(
113 | heroTag: 'needHelp',
114 | label: Text(
115 | Kstrings.send_otp,
116 | style: ktitleStyle,
117 | ),
118 | // text: "Forgot Pass?",
119 | onPressed: () {
120 | setState(() {
121 | isEnabled = !isEnabled;
122 | });
123 | },
124 | // height: 40,
125 | ),
126 | ),
127 | ),
128 | // ),
129 | SizedBox(
130 | height: 100,
131 | ),
132 | ],
133 | ),
134 | ),
135 | ),
136 | ],
137 | ),
138 | ),
139 | ),
140 | viewModelBuilder: () => MobileNoLoginViewModel(),
141 | );
142 | }
143 | }
144 |
--------------------------------------------------------------------------------
/lib/UI/Widgets/LiquidSwipe/liquid_swipe.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 |
3 | import 'package:flutter/material.dart';
4 | import 'package:flutter/widgets.dart';
5 | import 'Animation_Gesture/animated_page_dragger.dart';
6 | import 'Animation_Gesture/page_dragger.dart';
7 | import 'Animation_Gesture/page_reveal.dart';
8 | import 'Constants/constants.dart';
9 | import 'page.dart' as P;
10 |
11 | class LiquidSwipe extends StatefulWidget {
12 | final List pages;
13 | final double fullTransition;
14 | final Widget widget;
15 |
16 | const LiquidSwipe({
17 | Key key,
18 | this.pages,
19 | this.widget,
20 | this.fullTransition = FULL_TARNSITION_PX,
21 | }) : super(key: key);
22 |
23 | @override
24 | State createState() => _LiquidSwipe();
25 | }
26 |
27 | class SlideUpdate {
28 | final UpdateType updateType;
29 | final SlideDirection direction;
30 | final double slidePercent;
31 |
32 | SlideUpdate(
33 | this.direction,
34 | this.slidePercent,
35 | this.updateType,
36 | );
37 | }
38 |
39 | class _LiquidSwipe extends State with TickerProviderStateMixin {
40 | StreamController
41 | // ignore: close_sinks
42 | slideUpdateStream; //Stream controller is used to get all the updates when user slides across screen.
43 |
44 | AnimatedPageDragger
45 | animatedPageDragger; //When user stops dragging then by using this page automatically drags.
46 |
47 | int activePageIndex = 0; //active page index
48 | int nextPageIndex = 0; //next page index
49 | SlideDirection slideDirection = SlideDirection.none; //slide direction
50 | double slidePercent = 0.0; //slide percentage (0.0 to 1.0)
51 | StreamSubscription slideUpdateStream$;
52 |
53 | @override
54 | void initState() {
55 | //Stream Controller initialization
56 | slideUpdateStream = StreamController();
57 | //listening to updates of stream controller
58 | slideUpdateStream$ = slideUpdateStream.stream.listen((SlideUpdate event) {
59 | setState(() {
60 | //setState is used to change the values dynamically
61 |
62 | //if the user is dragging then
63 | if (event.updateType == UpdateType.dragging) {
64 | slideDirection = event.direction;
65 | slidePercent = event.slidePercent;
66 |
67 | //conditions on slide direction
68 | if (slideDirection == SlideDirection.leftToRight) {
69 | if (nextPageIndex < widget.pages.length && nextPageIndex > 0)
70 | nextPageIndex = activePageIndex - 1;
71 | } else if (slideDirection == SlideDirection.rightToLeft) {
72 | if (nextPageIndex < widget.pages.length - 1)
73 | nextPageIndex = activePageIndex + 1;
74 | } else {
75 | nextPageIndex = activePageIndex;
76 | }
77 | // making pages to be in loop
78 | // if (nextPageIndex > widget.pages.length - 1)
79 | // nextPageIndex = 0;
80 | // else if (nextPageIndex < 0) nextPageIndex = widget.pages.length - 1;
81 | }
82 | //if the user has done dragging
83 | else if (event.updateType == UpdateType.doneDragging) {
84 | // slidepercent > 0.2 so that it wont reveal itself unless this condition is true
85 | if (slidePercent > 0.2) {
86 | animatedPageDragger = AnimatedPageDragger(
87 | slideDirection: slideDirection,
88 | transitionGoal: TransitionGoal.open,
89 | slidePercent: slidePercent,
90 | slideUpdateStream: slideUpdateStream,
91 | vsync: this,
92 | );
93 | } else {
94 | animatedPageDragger = AnimatedPageDragger(
95 | slideDirection: slideDirection,
96 | transitionGoal: TransitionGoal.close,
97 | slidePercent: slidePercent,
98 | slideUpdateStream: slideUpdateStream,
99 | vsync: this,
100 | );
101 | nextPageIndex = activePageIndex;
102 | //to continue in the loop of pages
103 | if (nextPageIndex > widget.pages.length - 1)
104 | nextPageIndex = 0;
105 | else if (nextPageIndex < 0) nextPageIndex = widget.pages.length - 1;
106 | }
107 | //Run the animation
108 | animatedPageDragger.run();
109 | }
110 | //when animating
111 | else if (event.updateType == UpdateType.animating) {
112 | slideDirection = event.direction;
113 | slidePercent = event.slidePercent;
114 | }
115 | //done animating
116 | else if (event.updateType == UpdateType.doneAnimating) {
117 | activePageIndex = nextPageIndex;
118 | slideDirection = SlideDirection.none;
119 | slidePercent = 0.0;
120 | }
121 | });
122 | });
123 | super.initState();
124 | }
125 |
126 | @override
127 | void dispose() {
128 | slideUpdateStream$?.cancel();
129 | animatedPageDragger?.dispose();
130 | slideUpdateStream?.close();
131 | super.dispose();
132 | }
133 |
134 | @override
135 | Widget build(BuildContext context) {
136 | List pages = widget.pages;
137 | return Scaffold(
138 | //Stack is used to place components over one another.
139 | resizeToAvoidBottomInset: false,
140 | body: Stack(
141 | children: [
142 | P.Page(
143 | pageView: slideDirection == SlideDirection.leftToRight
144 | ? pages[activePageIndex]
145 | : pages[nextPageIndex],
146 | percentVisible: 1.0,
147 | ),
148 | //Pages
149 | PageReveal(
150 | //next page reveal
151 | revealPercent: slidePercent,
152 | child: P.Page(
153 | pageView: slideDirection == SlideDirection.leftToRight
154 | ? pages[nextPageIndex]
155 | : pages[activePageIndex],
156 | percentVisible: slidePercent),
157 | slideDirection: slideDirection,
158 | ),
159 |
160 | PageDragger(
161 | //Used for gesture control
162 | fullTransitionPX: widget.fullTransition,
163 | slideUpdateStream: this.slideUpdateStream,
164 | ), //PageDragger
165 | widget.widget,
166 | ], //Widget
167 | ), //Stack
168 | ); //Scaffold
169 | }
170 | }
171 |
--------------------------------------------------------------------------------
/lib/UI/Widgets/LiquidSwipe/WaveLayer.dart:
--------------------------------------------------------------------------------
1 | import 'dart:math';
2 |
3 | import 'package:flutter/material.dart';
4 |
5 | import 'Constants/constants.dart';
6 |
7 | class WaveLayer extends CustomClipper {
8 | double revealPercent;
9 | double waveCenterY;
10 | double waveHorRadius;
11 | double waveVertRadius;
12 | double sideWidth;
13 | SlideDirection slideDirection;
14 |
15 | WaveLayer({
16 | @required this.revealPercent,
17 | @required this.slideDirection,
18 | });
19 |
20 | @override
21 | getClip(Size size) {
22 | Path path = new Path();
23 | sideWidth = sidewidth(size);
24 | waveVertRadius = waveVertRadiusF(size);
25 | waveCenterY = size.height * 0.7167487685;
26 | if (slideDirection == SlideDirection.leftToRight) {
27 | waveHorRadius = waveHorRadiusFBack(size);
28 | } else {
29 | waveHorRadius = waveHorRadiusF(size);
30 | }
31 | var maskWidth = size.width - sideWidth;
32 | path.moveTo(maskWidth - sideWidth, 0);
33 | path.lineTo(0, 0);
34 | path.lineTo(0, size.height);
35 | path.lineTo(maskWidth, size.height);
36 | double curveStartY = waveCenterY + waveVertRadius;
37 |
38 | path.lineTo(maskWidth, curveStartY);
39 |
40 | path.cubicTo(
41 | maskWidth,
42 | curveStartY - waveVertRadius * 0.1346194756,
43 | maskWidth - waveHorRadius * 0.05341339583,
44 | curveStartY - waveVertRadius * 0.2412779634,
45 | maskWidth - waveHorRadius * 0.1561501458,
46 | curveStartY - waveVertRadius * 0.3322374268);
47 |
48 | path.cubicTo(
49 | maskWidth - waveHorRadius * 0.2361659167,
50 | curveStartY - waveVertRadius * 0.4030805244,
51 | maskWidth - waveHorRadius * 0.3305285625,
52 | curveStartY - waveVertRadius * 0.4561193293,
53 | maskWidth - waveHorRadius * 0.5012484792,
54 | curveStartY - waveVertRadius * 0.5350576951);
55 |
56 | path.cubicTo(
57 | maskWidth - waveHorRadius * 0.515878125,
58 | curveStartY - waveVertRadius * 0.5418222317,
59 | maskWidth - waveHorRadius * 0.5664134792,
60 | curveStartY - waveVertRadius * 0.5650349878,
61 | maskWidth - waveHorRadius * 0.574934875,
62 | curveStartY - waveVertRadius * 0.5689655122);
63 |
64 | path.cubicTo(
65 | maskWidth - waveHorRadius * 0.7283715208,
66 | curveStartY - waveVertRadius * 0.6397387195,
67 | maskWidth - waveHorRadius * 0.8086618958,
68 | curveStartY - waveVertRadius * 0.6833456585,
69 | maskWidth - waveHorRadius * 0.8774032292,
70 | curveStartY - waveVertRadius * 0.7399037439);
71 |
72 | path.cubicTo(
73 | maskWidth - waveHorRadius * 0.9653464583,
74 | curveStartY - waveVertRadius * 0.8122605122,
75 | maskWidth - waveHorRadius,
76 | curveStartY - waveVertRadius * 0.8936183659,
77 | maskWidth - waveHorRadius,
78 | curveStartY - waveVertRadius);
79 |
80 | path.cubicTo(
81 | maskWidth - waveHorRadius,
82 | curveStartY - waveVertRadius * 1.100142878,
83 | maskWidth - waveHorRadius * 0.9595746667,
84 | curveStartY - waveVertRadius * 1.1887991951,
85 | maskWidth - waveHorRadius * 0.8608411667,
86 | curveStartY - waveVertRadius * 1.270484439);
87 |
88 | path.cubicTo(
89 | maskWidth - waveHorRadius * 0.7852123333,
90 | curveStartY - waveVertRadius * 1.3330544756,
91 | maskWidth - waveHorRadius * 0.703382125,
92 | curveStartY - waveVertRadius * 1.3795848049,
93 | maskWidth - waveHorRadius * 0.5291125625,
94 | curveStartY - waveVertRadius * 1.4665102805);
95 |
96 | path.cubicTo(
97 | maskWidth - waveHorRadius * 0.5241858333,
98 | curveStartY - waveVertRadius * 1.4689677195,
99 | maskWidth - waveHorRadius * 0.505739125,
100 | curveStartY - waveVertRadius * 1.4781625854,
101 | maskWidth - waveHorRadius * 0.5015305417,
102 | curveStartY - waveVertRadius * 1.4802616098,
103 | );
104 |
105 | path.cubicTo(
106 | maskWidth - waveHorRadius * 0.3187486042,
107 | curveStartY - waveVertRadius * 1.5714239024,
108 | maskWidth - waveHorRadius * 0.2332057083,
109 | curveStartY - waveVertRadius * 1.6204116463,
110 | maskWidth - waveHorRadius * 0.1541165417,
111 | curveStartY - waveVertRadius * 1.687403);
112 |
113 | path.cubicTo(
114 | maskWidth - waveHorRadius * 0.0509933125,
115 | curveStartY - waveVertRadius * 1.774752061,
116 | maskWidth,
117 | curveStartY - waveVertRadius * 1.8709256829,
118 | maskWidth,
119 | curveStartY - waveVertRadius * 2);
120 |
121 | path.lineTo(maskWidth, 0);
122 | path.close();
123 |
124 | return path;
125 | }
126 |
127 | double sidewidth(Size size) {
128 | var p1 = 0.2;
129 | var p2 = 0.8;
130 | if (revealPercent <= p1) {
131 | return 15.0;
132 | }
133 | if (revealPercent >= p2) {
134 | return size.width;
135 | }
136 | return 15.0 + (size.width - 15.0) * (revealPercent - p1) / (p2 - p1);
137 | }
138 |
139 | @override
140 | bool shouldReclip(CustomClipper oldClipper) {
141 | return true;
142 | }
143 |
144 | double waveVertRadiusF(Size size) {
145 | var p1 = 0.4;
146 | if (revealPercent <= 0) {
147 | return 82.0;
148 | }
149 | if (revealPercent >= p1) {
150 | return size.height * 0.9;
151 | }
152 | return 82.0 + ((size.height * 0.9) - 82.0) * revealPercent / p1;
153 | }
154 |
155 | double waveHorRadiusF(Size size) {
156 | if (revealPercent <= 0) {
157 | return 48;
158 | }
159 | if (revealPercent >= 1) {
160 | return 0;
161 | }
162 | var p1 = 0.4;
163 | if (revealPercent <= p1) {
164 | return 48.0 + revealPercent / p1 * ((size.width * 0.8) - 48.0);
165 | }
166 | var t = (revealPercent - p1) / (1.0 - p1);
167 | var A = size.width * 0.8;
168 | var r = 40;
169 | var m = 9.8;
170 | var beta = r / (2 * m);
171 | var k = 50;
172 | var omega0 = k / m;
173 | var omega = pow(-pow(beta, 2) + pow(omega0, 2), 0.5);
174 |
175 | return A * exp(-beta * t) * cos(omega * t);
176 | }
177 |
178 | double waveHorRadiusFBack(Size size) {
179 | if (revealPercent <= 0) {
180 | return 48;
181 | }
182 | if (revealPercent >= 1) {
183 | return 0;
184 | }
185 | var p1 = 0.4;
186 | if (revealPercent <= p1) {
187 | return 48.0 + revealPercent / p1 * 48.0;
188 | }
189 | var t = (revealPercent - p1) / (1.0 - p1);
190 | var A = 96;
191 | var r = 40;
192 | var m = 9.8;
193 | var beta = r / (2 * m);
194 | var k = 50;
195 | var omega0 = k / m;
196 | var omega = pow(-pow(beta, 2) + pow(omega0, 2), 0.5);
197 |
198 | return A * exp(-beta * t) * cos(omega * t);
199 | }
200 | }
201 |
--------------------------------------------------------------------------------
/lib/UI/views/add_address/add_address_view.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:stacked/stacked.dart';
3 | import 'package:the_parker/ui/resources/APIKeys.dart';
4 | import 'package:the_parker/ui/resources/ConstantMethods.dart';
5 | import 'package:the_parker/ui/views/parking_spot_detail/parking_spot_detail_view.dart';
6 | import 'package:the_parker/ui/widgets/FloatingAppbar.dart';
7 | import './add_address_viewmodel.dart';
8 | import 'package:eva_icons_flutter/eva_icons_flutter.dart';
9 | import 'package:mapbox_search/mapbox_search.dart';
10 | import 'package:color/color.dart';
11 |
12 | class AddAddressView extends StatefulWidget {
13 | const AddAddressView({
14 | Key key,
15 | @required this.location,
16 | this.address,
17 | }) : super(key: key);
18 | final Location location;
19 | final MapBoxPlace address;
20 |
21 | @override
22 | _AddAddressViewState createState() => _AddAddressViewState();
23 | }
24 |
25 | class _AddAddressViewState extends State {
26 | StaticImage staticImage = StaticImage(apiKey: APIKeys.map_box_key);
27 | TextEditingController _addressController;
28 | TextEditingController _pincodeController;
29 | TextEditingController _mobileNoController;
30 |
31 | setTextEditingControllers() {
32 | if (widget.address != null) {
33 | _addressController =
34 | TextEditingController(text: widget.address.placeName);
35 | _pincodeController =
36 | TextEditingController(text: widget.address.addressNumber);
37 | _mobileNoController = TextEditingController();
38 | } else {
39 | _addressController = TextEditingController();
40 | _pincodeController = TextEditingController();
41 | _mobileNoController = TextEditingController();
42 | }
43 | }
44 |
45 | String getImageUrl() {
46 | var color = Colors.black;
47 | return staticImage.getStaticUrlWithMarker(
48 | marker: MapBoxMarker(
49 | markerColor: Color.rgb(color.red, color.green, color.blue),
50 | markerLetter: MakiIcons.parking.value,
51 | markerSize: MarkerSize.LARGE,
52 | ),
53 | center: widget.location,
54 | height: 900,
55 | width: 600,
56 | zoomLevel: 15,
57 | style: MapBoxStyle.Outdoors,
58 | render2x: true,
59 | );
60 | }
61 |
62 | @override
63 | Widget build(BuildContext context) {
64 | return ViewModelBuilder.reactive(
65 | viewModelBuilder: () => AddAddressViewModel(),
66 | onModelReady: (_) {
67 | setTextEditingControllers();
68 | },
69 | builder: (context, model, child) {
70 | return Scaffold(
71 | floatingActionButton: FloatingActionButton.extended(
72 | icon: Icon(
73 | EvaIcons.arrowForward,
74 | ),
75 | label: Text(
76 | 'Next',
77 | style: ksubtitleStyle,
78 | ),
79 | onPressed: () {
80 | kopenPage(context, ParkingSpotDetailView());
81 | },
82 | ),
83 | body: Stack(
84 | children: [
85 | Positioned(
86 | top: 0,
87 | left: 0,
88 | right: 0,
89 | bottom: 0,
90 | child: Container(
91 | height: MediaQuery.of(context).size.height * 0.35,
92 | // color: Colors.red,
93 | child: Image.network(
94 | getImageUrl(),
95 | fit: BoxFit.cover,
96 | ),
97 | ),
98 | ),
99 | Positioned(
100 | top: 0,
101 | left: 0,
102 | right: 0,
103 | bottom: 0,
104 | child: Container(
105 | height: MediaQuery.of(context).size.height * 0.35,
106 | color: Theme.of(context).primaryColor.withOpacity(0.6),
107 | ),
108 | ),
109 | Positioned(
110 | // top: MediaQuery.of(context).size.height * 0.15,
111 | left: 10,
112 | right: 10,
113 | bottom: MediaQuery.of(context).size.height * 0.1,
114 | child: Container(
115 | // color: Colors.red,
116 | child: Column(
117 | children: [
118 | TextField(
119 | controller: _addressController,
120 | keyboardType: TextInputType.multiline,
121 | style: ktitleStyle.copyWith(
122 | fontSize: 18,
123 | ),
124 | maxLines: 4,
125 | minLines: 2,
126 | enableInteractiveSelection: true,
127 | textInputAction: TextInputAction.unspecified,
128 | decoration: kTextFieldDecorationAddress.copyWith(
129 | labelText: 'Address',
130 | ),
131 | ),
132 | SizedBox(
133 | height: 20,
134 | ),
135 | TextField(
136 | controller: _pincodeController,
137 | keyboardType: TextInputType.text,
138 | style: ktitleStyle.copyWith(
139 | fontSize: 18,
140 | ),
141 | enableInteractiveSelection: true,
142 | textInputAction: TextInputAction.done,
143 | decoration: kTextFieldDecorationAddress.copyWith(
144 | labelText: 'Pincode',
145 | ),
146 | ),
147 | SizedBox(
148 | height: 20,
149 | ),
150 | TextField(
151 | controller: _mobileNoController,
152 | keyboardType: TextInputType.phone,
153 | style: ktitleStyle.copyWith(
154 | fontSize: 18,
155 | ),
156 | enableInteractiveSelection: true,
157 | textInputAction: TextInputAction.done,
158 | decoration: kTextFieldDecorationAddress.copyWith(
159 | labelText: 'Mobile No.',
160 | ),
161 | ),
162 | ],
163 | ),
164 | ),
165 | ),
166 | FloatingAppbar(
167 | fontSize: 20,
168 | title: 'Address',
169 | ),
170 | ],
171 | ),
172 | );
173 | });
174 | }
175 | }
176 |
--------------------------------------------------------------------------------
/lib/UI/views/home/subviews/ProfilePage.dart:
--------------------------------------------------------------------------------
1 | import 'package:eva_icons_flutter/eva_icons_flutter.dart';
2 | import 'package:extended_navbar_scaffold/extended_navbar_scaffold.dart';
3 | import 'package:flutter/material.dart';
4 | import 'package:the_parker/ui/resources/resources.dart';
5 |
6 | class ProfilePage extends StatelessWidget {
7 | final double currentSearchPercent;
8 |
9 | const ProfilePage({Key key, this.currentSearchPercent}) : super(key: key);
10 |
11 | @override
12 | Widget build(BuildContext context) {
13 | double height =
14 | (MediaQuery.of(context).size.height) * 0.75 * currentSearchPercent - 5;
15 | return currentSearchPercent != 0
16 | ? Positioned(
17 | top: 5 * currentSearchPercent,
18 | left: 5,
19 | right: 5,
20 | child: Opacity(
21 | opacity: currentSearchPercent,
22 | child: Container(
23 | height: height > 0 ? height : 0,
24 | decoration: BoxDecoration(
25 | color: Colors.white,
26 | borderRadius: BorderRadius.all(
27 | Radius.circular(
28 | 35 * currentSearchPercent,
29 | ),
30 | ),
31 | ),
32 | child: SafeArea(
33 | bottom: false,
34 | child: Stack(
35 | children: [
36 | // _buildProfileFields(height),
37 | ],
38 | ),
39 | ),
40 | ),
41 | ),
42 | )
43 | : const Padding(
44 | padding: const EdgeInsets.all(0),
45 | );
46 | }
47 |
48 | Widget _buildProfileFields(double height) {
49 | return Align(
50 | alignment: Alignment.topCenter,
51 | child: Card(
52 | elevation: 2,
53 | child: ClipPath(
54 | child: Container(
55 | height: height > 0 ? height * 0.13 : 0,
56 | decoration: BoxDecoration(
57 | border: Border(
58 | right: BorderSide(
59 | color: Colors.green,
60 | width: 5,
61 | ),
62 | ),
63 | ),
64 | child: Row(
65 | children: [
66 | Expanded(
67 | flex: 3,
68 | child: Container(
69 | height: height > 0 ? height * 0.13 : 0,
70 | child: Stack(
71 | children: [
72 | Positioned(
73 | left: 0,
74 | right: 0,
75 | top: 0,
76 | bottom: 0,
77 | child: Container(
78 | // color: Colors.red,
79 | child: Image.asset(
80 | Kassets.userFriendly,
81 | alignment: Alignment.center,
82 | fit: BoxFit.contain,
83 | ),
84 | ),
85 | ),
86 | Positioned(
87 | right: -3.5,
88 | left: -3.5,
89 | bottom: -3.5,
90 | child: Container(
91 | height: 35 * currentSearchPercent,
92 | // width: 45,
93 | child: Card(
94 | elevation: 0,
95 | color: Colors.black12,
96 | child: MaterialButton(
97 | color: Colors.black12,
98 | child: Icon(
99 | EvaIcons.camera,
100 | color: Colors.white70,
101 | // size: 24,
102 | ),
103 | onPressed: () {},
104 | ),
105 | ),
106 | ),
107 | ),
108 | ],
109 | ),
110 | ),
111 | ),
112 | Expanded(
113 | flex: 8,
114 | child: Container(
115 | padding: EdgeInsets.all(5),
116 | height: height > 0 ? height * 0.13 * 1 : 0,
117 | // color: Colors.blue,
118 | child: Column(
119 | mainAxisAlignment: MainAxisAlignment.spaceEvenly,
120 | crossAxisAlignment: CrossAxisAlignment.start,
121 | children: [
122 | Text(
123 | 'Ketan Choyal',
124 | style: ktitleStyle.copyWith(
125 | fontSize: 20 * currentSearchPercent,
126 | ),
127 | ),
128 | Row(
129 | children: [
130 | Icon(
131 | EvaIcons.phoneOutline,
132 | size: 22 * currentSearchPercent,
133 | ),
134 | SizedBox(
135 | width: 5,
136 | ),
137 | Text(
138 | '+91 8460805353',
139 | style: ktitleStyle.copyWith(
140 | fontSize: 14 * currentSearchPercent,
141 | ),
142 | ),
143 | ],
144 | ),
145 | Row(
146 | children: [
147 | Icon(
148 | EvaIcons.emailOutline,
149 | size: 22 * currentSearchPercent,
150 | ),
151 | SizedBox(
152 | width: 5,
153 | ),
154 | Flexible(
155 | child: Text(
156 | 'ketanchoyal@gmail.com',
157 | style: ktitleStyle.copyWith(
158 | fontSize: 14 * currentSearchPercent,
159 | ),
160 | ),
161 | ),
162 | ],
163 | )
164 | ],
165 | ),
166 | ),
167 | )
168 | ],
169 | ),
170 | ),
171 | clipper: ShapeBorderClipper(
172 | shape: RoundedRectangleBorder(
173 | borderRadius: BorderRadius.circular(3),
174 | ),
175 | ),
176 | ),
177 | ),
178 | );
179 | }
180 | }
181 |
--------------------------------------------------------------------------------
/lib/UI/views/login/login_view.dart:
--------------------------------------------------------------------------------
1 | import 'package:eva_icons_flutter/eva_icons_flutter.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:stacked/stacked.dart';
4 | import 'package:the_parker/ui/resources/ConstantMethods.dart';
5 | import 'package:the_parker/ui/resources/resources.dart';
6 | import 'package:the_parker/ui/views/home/home_view.dart';
7 | import 'package:the_parker/ui/widgets/TopBar.dart';
8 | import 'package:the_parker/ui/views/mobile_no_login/mobile_no_login_view.dart';
9 | import './login_viewmodel.dart';
10 |
11 | enum ButtonType { LOGIN, REGISTER }
12 |
13 | class LoginView extends StatefulWidget {
14 | @override
15 | _LoginViewState createState() => _LoginViewState();
16 | }
17 |
18 | class _LoginViewState extends State {
19 | bool isRegistered = false;
20 | String notYetRegisteringText = Kstrings.not_registered;
21 | ButtonType buttonType = ButtonType.LOGIN;
22 | final _scaffoldKey = GlobalKey();
23 | @override
24 | Widget build(BuildContext context) {
25 | return ViewModelBuilder.reactive(
26 | builder: (context, model, child) => Scaffold(
27 | key: _scaffoldKey,
28 | resizeToAvoidBottomInset: false,
29 | appBar: TopBar(
30 | title: Kstrings.login,
31 | child: kBackBtn,
32 | onPressed: () {
33 | Navigator.pop(context);
34 | },
35 | ),
36 | floatingActionButton: Row(
37 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
38 | children: [
39 | Padding(
40 | padding: const EdgeInsets.only(left: 31),
41 | child: FloatingActionButton.extended(
42 | heroTag: 'abc',
43 | label: Container(),
44 | onPressed: () {
45 | kopenPageBottom(context, MobileNoLoginView());
46 | },
47 | icon: Padding(
48 | padding: const EdgeInsets.only(left: 15),
49 | child: Icon(EvaIcons.phone),
50 | )),
51 | ),
52 | FloatingActionButton.extended(
53 | label: Text(
54 | buttonType == ButtonType.LOGIN
55 | ? Kstrings.login
56 | : Kstrings.register,
57 | style: ktitleStyle,
58 | ),
59 | onPressed: () {
60 | kopenPage(context, HomeView());
61 | },
62 | icon: Icon(EvaIcons.logIn)),
63 | ],
64 | ),
65 | body: SingleChildScrollView(
66 | child: Column(
67 | children: [
68 | Hero(
69 | tag: 'imageee',
70 | child: Image.asset(
71 | Kassets.group,
72 | width: MediaQuery.of(context).size.width - 50,
73 | alignment: Alignment.center,
74 | ),
75 | ),
76 | Padding(
77 | padding: EdgeInsets.only(left: 20, right: 20, top: 10),
78 | child: Column(
79 | children: [
80 | SizedBox(
81 | height: 10,
82 | ),
83 | TextField(
84 | onChanged: (email) {},
85 | keyboardType: TextInputType.emailAddress,
86 | style: ksubtitleStyle.copyWith(fontSize: 18),
87 | decoration: kTextFieldDecoration.copyWith(
88 | hintText: Kstrings.email_hint,
89 | labelText: Kstrings.email,
90 | ),
91 | ),
92 | SizedBox(
93 | height: 15,
94 | ),
95 | TextField(
96 | obscureText: true,
97 | onChanged: (password) {},
98 | keyboardType: TextInputType.emailAddress,
99 | style: ksubtitleStyle.copyWith(fontSize: 18),
100 | decoration: kTextFieldDecoration.copyWith(
101 | hintText: Kstrings.password_hint,
102 | labelText: Kstrings.password,
103 | ),
104 | ),
105 | isRegistered
106 | ? SizedBox(
107 | height: 15,
108 | )
109 | : Container(),
110 | isRegistered
111 | ? TextField(
112 | obscureText: true,
113 | onChanged: (password) {},
114 | keyboardType: TextInputType.emailAddress,
115 | style: TextStyle(
116 | fontSize: 18, fontWeight: FontWeight.w500),
117 | decoration: kTextFieldDecoration.copyWith(
118 | hintText: Kstrings.password_hint,
119 | labelText: Kstrings.confirm_password,
120 | ),
121 | )
122 | : Container(),
123 | SizedBox(
124 | height: 15,
125 | ),
126 | // Hero(
127 | // tag: 'otpForget',
128 | // child:
129 | Container(
130 | height: 50,
131 | width: MediaQuery.of(context).size.width,
132 | child: Row(
133 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
134 | children: [
135 | FloatingActionButton.extended(
136 | heroTag: 'sfhic',
137 | label: Text(
138 | notYetRegisteringText,
139 | style: ktitleStyle,
140 | ),
141 | onPressed: () {
142 | setState(() {
143 | if (buttonType == ButtonType.LOGIN) {
144 | buttonType = ButtonType.REGISTER;
145 | } else {
146 | buttonType = ButtonType.LOGIN;
147 | }
148 | isRegistered = !isRegistered;
149 | notYetRegisteringText = isRegistered
150 | ? Kstrings.registered
151 | : Kstrings.not_registered;
152 | });
153 | },
154 | // height: 40,
155 | ),
156 | FloatingActionButton.extended(
157 | heroTag: 'needHelp',
158 | label: Text(
159 | Kstrings.need_help,
160 | style: ktitleStyle,
161 | ),
162 | onPressed: () {
163 | //Forget Password Logic
164 | // kopenPage(context, ForgotPasswordPage());
165 | },
166 | // height: 40,
167 | ),
168 | ],
169 | ),
170 | ),
171 | // ),
172 | SizedBox(
173 | height: 250,
174 | ),
175 | ],
176 | ),
177 | ),
178 | ],
179 | ),
180 | ),
181 | ),
182 | viewModelBuilder: () => LoginViewModel(),
183 | );
184 | }
185 | }
186 |
--------------------------------------------------------------------------------
/lib/UI/views/home/subviews/MapPage.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 | import 'package:flutter/material.dart';
3 | import 'package:geolocator/geolocator.dart';
4 | import 'package:google_maps_flutter/google_maps_flutter.dart';
5 |
6 | class MapPage extends StatefulWidget {
7 | @override
8 | State createState() => MapPageState();
9 | }
10 |
11 | class MapPageState extends State {
12 | CameraPosition _initialCamera = CameraPosition(
13 | target: LatLng(0, 0),
14 | zoom: 4,
15 | );
16 |
17 | Completer _controller = Completer();
18 |
19 | CameraPosition _lastKnownPosition;
20 | CameraPosition _currentPosition;
21 | bool androidFusedLocation = true;
22 |
23 | @override
24 | void initState() {
25 | super.initState();
26 |
27 | _initLastKnownLocation();
28 | _initCurrentLocation();
29 | }
30 |
31 | @override
32 | void didUpdateWidget(Widget oldWidget) {
33 | super.didUpdateWidget(oldWidget);
34 |
35 | // setState(() {
36 | // _lastKnownPosition = null;
37 | // _currentPosition = null;
38 | // });
39 |
40 | // _initLastKnownLocation();
41 | // _initCurrentLocation();
42 | }
43 |
44 | // Platform messages are asynchronous, so we initialize in an async method.
45 | Future _initLastKnownLocation() async {
46 | Position position;
47 | final GoogleMapController controller = await _controller.future;
48 | // Platform messages may fail, so we use a try/catch PlatformException.
49 | try {
50 | // ..forceAndroidLocationManager = !androidFusedLocation;
51 | position = await Geolocator.getLastKnownPosition();
52 | } on Exception {
53 | position = null;
54 | }
55 |
56 | // If the widget was removed from the tree while the asynchronous platform
57 | // message was in flight, we want to discard the reply rather than calling
58 | // setState to update our non-existent appearance.
59 | if (!mounted) {
60 | return;
61 | }
62 |
63 | setState(
64 | () {
65 | _add(position);
66 | _lastKnownPosition = CameraPosition(
67 | target: LatLng(
68 | position.latitude,
69 | position.longitude,
70 | ),
71 | zoom: 16,
72 | );
73 |
74 | controller.animateCamera(
75 | CameraUpdate.newCameraPosition(_lastKnownPosition),
76 | );
77 | },
78 | );
79 | }
80 |
81 | // Platform messages are asynchronous, so we initialize in an async method.
82 | _initCurrentLocation() async {
83 | final GoogleMapController controller = await _controller.future;
84 | Geolocator.getCurrentPosition(
85 | desiredAccuracy: LocationAccuracy.best,
86 | ).then((position) {
87 | if (mounted) {
88 | setState(() {
89 | _add(position);
90 | _currentPosition = CameraPosition(
91 | target: LatLng(position.latitude, position.longitude),
92 | zoom: 16,
93 | );
94 | controller.animateCamera(
95 | CameraUpdate.newCameraPosition(_currentPosition),
96 | );
97 | });
98 | }
99 | }).catchError((e) {
100 | //
101 | });
102 | }
103 |
104 | _gotoMyLocation() async {
105 | final GoogleMapController controller = await _controller.future;
106 | controller.animateCamera(
107 | CameraUpdate.newCameraPosition(
108 | _currentPosition ?? _lastKnownPosition ?? _initialCamera),
109 | );
110 | }
111 |
112 | Map markers = Map();
113 | MarkerId selectedMarker;
114 | static final LatLng center = const LatLng(-33.86711, 151.1947171);
115 | int _markerIdCounter = 1;
116 |
117 | void _onMarkerTapped(MarkerId markerId) {
118 | final Marker tappedMarker = markers[markerId];
119 | if (tappedMarker != null) {
120 | setState(() {
121 | if (markers.containsKey(selectedMarker)) {
122 | final Marker resetOld = markers[selectedMarker]
123 | .copyWith(iconParam: BitmapDescriptor.defaultMarker);
124 | markers[selectedMarker] = resetOld;
125 | }
126 | selectedMarker = markerId;
127 | final Marker newMarker = tappedMarker.copyWith(
128 | draggableParam: true,
129 | iconParam: BitmapDescriptor.defaultMarkerWithHue(
130 | BitmapDescriptor.hueGreen,
131 | ),
132 | );
133 | markers[markerId] = newMarker;
134 | });
135 | }
136 | }
137 |
138 | void _add(Position position) {
139 | final int markerCount = markers.length;
140 |
141 | if (markerCount == 12) {
142 | return;
143 | }
144 |
145 | final String markerIdVal = 'marker_id_$_markerIdCounter';
146 | _markerIdCounter++;
147 | final MarkerId markerId = MarkerId(markerIdVal);
148 |
149 | final Marker marker = Marker(
150 | visible: true,
151 | markerId: markerId,
152 | // icon: BitmapDescriptor.,
153 | position: LatLng(position.latitude, position.longitude
154 | // center.latitude + sin(_markerIdCounter * pi / 6.0) / 20.0,
155 | // center.longitude + cos(_markerIdCounter * pi / 6.0) / 20.0,
156 | ),
157 | infoWindow: InfoWindow(title: markerIdVal, snippet: 'Hello'),
158 | onTap: () {
159 | _onMarkerTapped(markerId);
160 | },
161 | );
162 |
163 | setState(() {
164 | markers[markerId] = marker;
165 | });
166 | }
167 |
168 | @override
169 | Widget build(BuildContext context) {
170 | return new Scaffold(
171 | body: FutureBuilder(
172 | future: Geolocator.checkPermission(),
173 | builder: (BuildContext context,
174 | AsyncSnapshot snapshot) {
175 | if (!snapshot.hasData) {
176 | return const Center(child: CircularProgressIndicator());
177 | }
178 | if (snapshot.data == LocationPermission.denied ||
179 | snapshot.data == LocationPermission.deniedForever) {
180 | return Center(
181 | child: TextButton(
182 | onPressed: () async {
183 | await Geolocator.requestPermission();
184 | setState(() {});
185 | },
186 | child: Text("Grant Permission"),
187 | ),
188 | );
189 | }
190 | return Stack(
191 | children: [
192 | GoogleMap(
193 | // gestureRecognizers: Set()
194 | // ..add(Factory(
195 | // () => PanGestureRecognizer()))
196 | // ..add(Factory(
197 | // () => ScaleGestureRecognizer()))
198 | // ..add(Factory(
199 | // () => TapGestureRecognizer()))
200 | // ..add(Factory(
201 | // () => VerticalDragGestureRecognizer())),
202 | buildingsEnabled: true,
203 | indoorViewEnabled: true,
204 | scrollGesturesEnabled: true,
205 | mapType: MapType.terrain,
206 | compassEnabled: true,
207 | myLocationEnabled: true,
208 | myLocationButtonEnabled: false,
209 | initialCameraPosition:
210 | _currentPosition ?? _lastKnownPosition ?? _initialCamera,
211 | rotateGesturesEnabled: true,
212 | onMapCreated: (GoogleMapController controller) {
213 | _controller.complete(controller);
214 | },
215 | // onCameraMove: (CameraPosition position) {
216 | // CameraUpdate.newCameraPosition(position);
217 | // },
218 | // markers: Set.of(markers.values),
219 | ),
220 |
221 | // _builtSearchBar(),
222 | ],
223 | );
224 | }),
225 | floatingActionButton: Padding(
226 | padding: const EdgeInsets.only(bottom: 65),
227 | child: FloatingActionButton(
228 | backgroundColor: Theme.of(context).canvasColor,
229 | onPressed: () async {
230 | await _gotoMyLocation();
231 | },
232 | child: Icon(Icons.location_searching,
233 | color: Theme.of(context).textTheme.body1.color),
234 | ),
235 | ),
236 | );
237 | }
238 | }
239 |
--------------------------------------------------------------------------------
/lib/UI/views/home/home_view.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:stacked/stacked.dart';
3 | import 'subviews/MapPage.dart';
4 | import './home_viewmodel.dart';
5 | import 'dart:math';
6 | import 'package:eva_icons_flutter/eva_icons_flutter.dart';
7 | import 'package:extended_navbar_scaffold/extended_navbar_scaffold.dart';
8 | import 'package:flutter/cupertino.dart';
9 | import 'package:flutter_vector_icons/flutter_vector_icons.dart';
10 | import 'package:mapbox_search/mapbox_search.dart';
11 | import 'package:mapbox_search_flutter/mapbox_search_flutter.dart';
12 | import 'package:the_parker/ui/resources/APIKeys.dart';
13 | import 'package:the_parker/ui/resources/ConstantMethods.dart';
14 | import 'package:the_parker/ui/views/offer_parking_map/offer_parking_map_view.dart';
15 | import 'package:the_parker/ui/widgets/ProfileWidget.dart';
16 | import 'package:color/color.dart';
17 | import 'subviews/ProfilePage.dart';
18 |
19 | // class ParallexCardItemssNew extends ParallaxCardItem {
20 | // ParallexCardItemssNew({
21 | // this.title,
22 | // this.body,
23 | // this.background,
24 | // this.data,
25 | // });
26 |
27 | // final String title;
28 | // final String body;
29 | // final Widget background;
30 | // final dynamic data;
31 | // }
32 |
33 | class HomeView extends StatefulWidget {
34 | HomeView({Key key}) : super(key: key);
35 |
36 | _HomeViewState createState() => _HomeViewState();
37 | }
38 |
39 | class _HomeViewState extends State with TickerProviderStateMixin {
40 | bool isBottomBarOpen = false;
41 | bool closeCards = false;
42 | bool searchBarVisible = false;
43 | final scaffoldKey = GlobalKey();
44 | double currentBottomBarSearchPercent = 0.0;
45 |
46 | AnimationController animationControllerProfile;
47 | var offsetProfile = 0.0;
48 | // get currentProfilePercent => max(0.0, min(1.0, offsetProfile / (347 - 68.0)));
49 | get currentProfilePercent => max(
50 | 0.0,
51 | min(1.0,
52 | offsetProfile / (MediaQuery.of(context).size.height * 0.75 - 90.0)));
53 |
54 | double profilePercentage = 0.0;
55 | bool isProfileOpen = false;
56 |
57 | CurvedAnimation curve;
58 | Animation animation;
59 |
60 | void onSearchVerticalDragUpdate(details) {
61 | closeCards = isBottomBarOpen;
62 | print("Offset : " + offsetProfile.toString());
63 | print("Offset Height : " +
64 | ((MediaQuery.of(context).size.height) * 0.75).toString());
65 | print("Percentage : " + currentProfilePercent.toString());
66 | offsetProfile += details.delta.dy;
67 | if (offsetProfile > (MediaQuery.of(context).size.height) * 0.75) {
68 | offsetProfile = (MediaQuery.of(context).size.height) * 0.75;
69 | } else if (offsetProfile < 0) {
70 | offsetProfile = 0;
71 | }
72 | setState(() {});
73 | }
74 |
75 | void animateProfile(bool open) {
76 | animationControllerProfile = AnimationController(
77 | duration: Duration(
78 | milliseconds: 1 +
79 | (800 *
80 | (isProfileOpen
81 | ? currentProfilePercent
82 | : (1 - currentProfilePercent)))
83 | .toInt()),
84 | vsync: this);
85 | curve =
86 | CurvedAnimation(parent: animationControllerProfile, curve: Curves.ease);
87 | animation = Tween(
88 | begin: offsetProfile,
89 | end: open ? (MediaQuery.of(context).size.height) * 0.75 : 0.0)
90 | .animate(curve)
91 | ..addListener(() {
92 | setState(() {
93 | offsetProfile = animation.value;
94 | });
95 | })
96 | ..addStatusListener((status) {
97 | if (status == AnimationStatus.completed) {
98 | isProfileOpen = open;
99 | }
100 | });
101 | animationControllerProfile.forward();
102 | }
103 |
104 | StaticImage staticImage = StaticImage(apiKey: APIKeys.map_box_key);
105 |
106 | @override
107 | build(BuildContext context) {
108 | return ViewModelBuilder.reactive(
109 | viewModelBuilder: () => HomeViewModel(),
110 | builder: (context, model, child) => ExtendedNavigationBarScaffold(
111 | elevation: 0,
112 | searchWidget: builtSearchBar(),
113 | body: Stack(
114 | children: [
115 | MapPage(),
116 | ProfilePage(
117 | currentSearchPercent: currentProfilePercent,
118 | ),
119 | ProfileWidget(
120 | currentProfilePercent: currentProfilePercent,
121 | isProfileOpen: isProfileOpen,
122 | animateProfile: animateProfile,
123 | onVerticalDragUpdate: onSearchVerticalDragUpdate,
124 | onPanDown: () => animationControllerProfile?.stop(),
125 | ),
126 | ],
127 | ),
128 | currentBottomBarCenterPercent: (currentBottomBarCenterPercent) {
129 | print("Parallex Percentage : " +
130 | currentBottomBarCenterPercent.toString());
131 | if (currentBottomBarCenterPercent > 0.25) {
132 | if (isProfileOpen) {
133 | animateProfile(false);
134 | }
135 | }
136 | },
137 | currentBottomBarMorePercent: (currentBottomBarMorePercent) {
138 | print("More Percentage : " + currentBottomBarMorePercent.toString());
139 | if (currentBottomBarMorePercent > 0.25) {
140 | if (isProfileOpen) {
141 | animateProfile(false);
142 | }
143 | }
144 | },
145 | currentBottomBarSearchPercent: (currentBottomBarSearchPercent) {
146 | this.currentBottomBarSearchPercent = currentBottomBarSearchPercent;
147 | print('Search Percentage : ' +
148 | currentBottomBarSearchPercent.toString());
149 |
150 | if (currentBottomBarSearchPercent == 0.0) {
151 | searchBarVisible = false;
152 | } else {
153 | searchBarVisible = true;
154 | }
155 | setState(() {});
156 | },
157 | currentExternalAnimationPercentage: currentProfilePercent,
158 | onTap: (value) => {
159 | if (value == 0)
160 | {hideProfile()}
161 | else if (value == 1)
162 | {hideProfile()}
163 | else
164 | {
165 | enableDisableSearchBar()
166 | // showPlacePicker(context)
167 | }
168 | },
169 | moreButtons: [
170 | MoreButtonModel(
171 | icon: MaterialCommunityIcons.wallet,
172 | label: 'Wallet',
173 | onTap: () {},
174 | ),
175 | MoreButtonModel(
176 | icon: MaterialCommunityIcons.parking,
177 | label: 'My Bookings',
178 | onTap: () {},
179 | ),
180 | MoreButtonModel(
181 | icon: MaterialCommunityIcons.car_multiple,
182 | label: 'My Cars',
183 | onTap: () {},
184 | ),
185 | MoreButtonModel(
186 | icon: FontAwesome.book,
187 | label: 'Transactions',
188 | onTap: () {},
189 | ),
190 | MoreButtonModel(
191 | icon: MaterialCommunityIcons.home_map_marker,
192 | label: 'Offer Parking',
193 | onTap: () {
194 | kopenPage(
195 | context,
196 | OfferParkingMapView(),
197 | );
198 | },
199 | ),
200 | MoreButtonModel(
201 | icon: FontAwesome5Regular.user_circle,
202 | label: 'Profile',
203 | onTap: () {
204 | animateProfile(true);
205 | },
206 | ),
207 | MoreButtonModel(
208 | icon: EvaIcons.settings,
209 | label: 'Settings',
210 | onTap: () {},
211 | ),
212 | null,
213 | null,
214 | ],
215 | parallexCardPageTransformer: PageTransformer(
216 | pageViewBuilder: (context, visibilityResolver) {
217 | return PageView.builder(
218 | controller: PageController(viewportFraction: 0.85),
219 | itemCount: parallaxCardItemsList.length,
220 | itemBuilder: (context, index) {
221 | final item = parallaxCardItemsList[index];
222 | String mapStaticImageUrl = staticImage.getStaticUrlWithPolyline(
223 | point1: Location(lat: 37.77343, lng: -122.46589),
224 | point2: Location(lat: 37.75965, lng: -122.42816),
225 | center: Location(lat: 0.0, lng: 0.0),
226 | marker1: MapBoxMarker(
227 | markerColor: Color.rgb(0, 0, 0),
228 | markerLetter: MakiIcons.airport.value,
229 | markerSize: MarkerSize.SMALL),
230 | marker2: MapBoxMarker(
231 | markerColor: Color.rgb(244, 67, 54),
232 | markerLetter: 'q',
233 | markerSize: MarkerSize.SMALL),
234 | height: 300,
235 | width: 500,
236 | style: MapBoxStyle.Streets,
237 | render2x: true,
238 | auto: true,
239 | );
240 | var background = Image.network(
241 | mapStaticImageUrl,
242 | fit: BoxFit.cover,
243 | );
244 | final pageVisibility =
245 | visibilityResolver.resolvePageVisibility(index);
246 | return ParallaxCardsWidget(
247 | item: ParallaxCardItem(
248 | body: item.body,
249 | background: background,
250 | // background: Container(
251 | // color: Colors.red,
252 | // ),
253 | // background: background,
254 | title: item.title,
255 | ),
256 | pageVisibility: pageVisibility,
257 | );
258 | },
259 | );
260 | },
261 | ),
262 | ),
263 | );
264 | }
265 |
266 | final parallaxCardItemsList = [
267 | ParallaxCardItem(
268 | title: 'Some Random Route 1',
269 | body: 'Place 1',
270 | // marker: Marker(
271 | // markerId: MarkerId('nswtdkaslnnad'),
272 | // position: LatLng(19.017573, 72.856276),
273 | // ),
274 | ),
275 | ParallaxCardItem(
276 | title: 'Some Random Route 2',
277 | body: 'Place 2',
278 | // marker: Marker(
279 | // markerId: MarkerId('nsdkasnnad'),
280 | // position: LatLng(19.017573, 72.856276)),
281 | ),
282 | ParallaxCardItem(
283 | title: 'Some Random Route 3',
284 | body: 'Place 1',
285 | // marker: Marker(
286 | // markerId: MarkerId('nsdkasnndswad'),
287 | // position: LatLng(19.077573, 72.856276)),
288 | ),
289 | ];
290 |
291 | hideProfile() {
292 | animateProfile(false);
293 | // setState(() {});
294 | }
295 |
296 | enableDisableSearchBar() {
297 | setState(() {
298 | searchBarVisible = !searchBarVisible;
299 | });
300 | }
301 |
302 | Widget builtSearchBar() {
303 | return Padding(
304 | padding: const EdgeInsets.only(bottom: 5),
305 | child: MapBoxPlaceSearchWidget(
306 | apiKey: APIKeys.map_box_key,
307 | // limit: 10,
308 | context: context,
309 | popOnSelect: false,
310 | // height: 100,
311 | height: 290,
312 | // language: 'en',
313 | // location: LatLng(location.latitude, location.longitude),
314 | onSelected: (MapBoxPlace place) async {
315 | print(place.center);
316 | // print(place.)
317 | },
318 | ),
319 | );
320 | }
321 |
322 | @override
323 | void dispose() {
324 | super.dispose();
325 |
326 | animationControllerProfile?.dispose();
327 | }
328 | }
329 |
--------------------------------------------------------------------------------
/lib/UI/views/offer_parking_map/offer_parking_map_view.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:stacked/stacked.dart';
3 | import 'package:the_parker/ui/resources/APIKeys.dart';
4 | import 'package:the_parker/ui/resources/ConstantMethods.dart';
5 | import 'package:the_parker/ui/views/add_address/add_address_view.dart';
6 | import './offer_parking_map_viewmodel.dart';
7 |
8 | import 'dart:async';
9 |
10 | import 'package:color/color.dart';
11 | import 'package:eva_icons_flutter/eva_icons_flutter.dart';
12 | import 'package:flare_flutter/flare_actor.dart';
13 | import 'package:flutter_map/plugin_api.dart';
14 | import 'package:geolocator/geolocator.dart';
15 | import 'package:latlong/latlong.dart';
16 | import 'package:mapbox_search/mapbox_search.dart';
17 | import 'package:the_parker/ui/widgets/FloatingAppbar.dart';
18 | import 'package:user_location/user_location.dart';
19 |
20 | class OfferParkingMapView extends StatefulWidget {
21 | OfferParkingMapView({Key key}) : super(key: key);
22 |
23 | _OfferParkingMapViewState createState() => _OfferParkingMapViewState();
24 | }
25 |
26 | class _OfferParkingMapViewState extends State
27 | with TickerProviderStateMixin {
28 | LatLng _initialCamera = LatLng(51.5, -0.09);
29 | UserLocationOptions userLocationOptions;
30 |
31 | MapController _controller;
32 |
33 | LatLng _lastKnownPosition;
34 | LatLng _currentPosition;
35 |
36 | bool androidFusedLocation = true;
37 |
38 | void _animatedMapMove(LatLng destLocation, double destZoom) {
39 | // Create some tweens. These serve to split up the transition from one location to another.
40 | // In our case, we want to split the transition be our current map center and the destination.
41 | final _latTween = Tween(
42 | begin: _controller.center.latitude, end: destLocation.latitude);
43 | final _lngTween = Tween(
44 | begin: _controller.center.longitude, end: destLocation.longitude);
45 | final _zoomTween = Tween(begin: _controller.zoom, end: destZoom);
46 |
47 | // Create a animation controller that has a duration and a TickerProvider.
48 | var controller = AnimationController(
49 | duration: const Duration(milliseconds: 500), vsync: this);
50 | // The animation determines what path the animation will take. You can try different Curves values, although I found
51 | // fastOutSlowIn to be my favorite.
52 | Animation animation =
53 | CurvedAnimation(parent: controller, curve: Curves.fastOutSlowIn);
54 |
55 | controller.addListener(() {
56 | _controller.move(
57 | LatLng(_latTween.evaluate(animation), _lngTween.evaluate(animation)),
58 | _zoomTween.evaluate(animation));
59 | });
60 |
61 | animation.addStatusListener((status) {
62 | if (status == AnimationStatus.completed) {
63 | controller.dispose();
64 | } else if (status == AnimationStatus.dismissed) {
65 | controller.dispose();
66 | }
67 | });
68 |
69 | controller.forward();
70 | }
71 |
72 | Stream _realtimeLocationStream() {
73 | Stream positionStream =
74 | Geolocator.getPositionStream().asBroadcastStream();
75 | positionStream.listen((Position pos) {
76 | _lastKnownPosition = _currentPosition;
77 | _currentPosition = LatLng(pos.latitude, pos.longitude);
78 | return;
79 | });
80 | return positionStream;
81 | }
82 |
83 | StreamController _zoom = StreamController();
84 |
85 | @override
86 | void dispose() {
87 | _zoom.close();
88 | super.dispose();
89 | }
90 |
91 | @override
92 | void initState() {
93 | _controller = MapController();
94 | super.initState();
95 |
96 | _initLastKnownLocation();
97 | _initCurrentLocation();
98 | }
99 |
100 | @override
101 | void didUpdateWidget(Widget oldWidget) {
102 | super.didUpdateWidget(oldWidget);
103 |
104 | setState(() {
105 | _lastKnownPosition = null;
106 | _currentPosition = null;
107 | });
108 |
109 | _initLastKnownLocation();
110 | _initCurrentLocation();
111 | }
112 |
113 | // Platform messages are asynchronous, so we initialize in an async method.
114 | Future _initLastKnownLocation() async {
115 | Position position;
116 | // Platform messages may fail, so we use a try/catch PlatformException.
117 | try {
118 | position = await Geolocator.getLastKnownPosition();
119 | } on Exception {
120 | position = null;
121 | }
122 |
123 | // If the widget was removed from the tree while the asynchronous platform
124 | // message was in flight, we want to discard the reply rather than calling
125 | // setState to update our non-existent appearance.
126 | if (!mounted) {
127 | return;
128 | }
129 |
130 | setState(
131 | () {
132 | // _add(position);
133 | _lastKnownPosition = LatLng(
134 | position.latitude,
135 | position.longitude,
136 | );
137 |
138 | _animatedMapMove(_lastKnownPosition, 16);
139 |
140 | // _controller.move(_lastKnownPosition, 16);
141 | },
142 | );
143 | }
144 |
145 | // Platform messages are asynchronous, so we initialize in an async method.
146 | _initCurrentLocation() async {
147 | Geolocator.getCurrentPosition(
148 | desiredAccuracy: LocationAccuracy.best,
149 | ).then((position) {
150 | if (mounted) {
151 | setState(() {
152 | _currentPosition = LatLng(position.latitude, position.longitude);
153 | _animatedMapMove(_currentPosition, 16);
154 | });
155 | }
156 | }).catchError((e) {
157 | //
158 | });
159 | }
160 |
161 | _gotoMyLocation() async {
162 | // _initCurrentLocation();
163 | _animatedMapMove(
164 | _currentPosition ?? _lastKnownPosition ?? _initialCamera, 17);
165 | }
166 |
167 | List markers = [];
168 |
169 | addMarkerInList(Marker newMarker) {
170 | markers.clear();
171 | markers.add(newMarker);
172 | setState(() {});
173 | }
174 |
175 | double zoom = 8;
176 |
177 | @override
178 | build(BuildContext context) {
179 | userLocationOptions = UserLocationOptions(
180 | context: context,
181 | mapController: _controller,
182 | zoomToCurrentLocationOnLoad: false,
183 | updateMapLocationOnPositionChange: false,
184 | showMoveToCurrentLocationFloatingActionButton: false,
185 | markers: markers,
186 | );
187 | return ViewModelBuilder.reactive(
188 | viewModelBuilder: () => OfferParkingMapViewModel(),
189 | builder: (context, model, child) {
190 | return Scaffold(
191 | floatingActionButtonAnimator: NoScalingAnimation(),
192 | floatingActionButtonLocation: markers.length > 0
193 | ? FloatingActionButtonLocation.centerFloat
194 | : FloatingActionButtonLocation.endFloat,
195 | floatingActionButton: markers.length > 0
196 | ? FloatingActionButton.extended(
197 | // heroTag: 'sdsa',
198 | backgroundColor: Theme.of(context).canvasColor,
199 | onPressed: () async {
200 | print(markers.first.point);
201 |
202 | LatLng point = markers.first.point;
203 | ReverseGeoCoding geoCoding = ReverseGeoCoding(
204 | apiKey: APIKeys.map_box_key,
205 | limit: 5,
206 | location: Location(
207 | lat: point.latitude,
208 | lng: point.longitude,
209 | ),
210 | );
211 |
212 | var predection = await geoCoding.getAddress(
213 | Location(
214 | lat: point.latitude,
215 | lng: point.longitude,
216 | ),
217 | );
218 |
219 | print(predection.first.placeName);
220 |
221 | kopenPage(
222 | context,
223 | AddAddressView(
224 | location: Location(
225 | lat: markers.first.point.latitude,
226 | lng: markers.first.point.longitude,
227 | ),
228 | address: predection.first,
229 | ));
230 | },
231 | label: Text(
232 | 'Next',
233 | style: ktitleStyle,
234 | ),
235 | icon: Icon(
236 | EvaIcons.arrowIosForward,
237 | color: Theme.of(context).textTheme.bodyText2.color,
238 | ),
239 | )
240 | : FloatingActionButton(
241 | // heroTag: 'sdsa',
242 | backgroundColor: Theme.of(context).canvasColor,
243 | onPressed: () async {
244 | await _gotoMyLocation();
245 | },
246 |
247 | isExtended: markers.length > 0,
248 | child: Icon(
249 | Icons.location_searching,
250 | color: Theme.of(context).textTheme.bodyText2.color,
251 | ),
252 | ),
253 | body: Stack(
254 | children: [
255 | buildMap(),
256 | FloatingAppbar(
257 | title: 'Long Tap to select parking Space',
258 | )
259 | ],
260 | ),
261 | );
262 | });
263 | }
264 |
265 | buildMap() {
266 | return StreamBuilder(
267 | stream: _realtimeLocationStream(),
268 | builder: (context, snapshot) {
269 | return StreamBuilder(
270 | stream: _zoom.stream,
271 | initialData: 8,
272 | builder: (context, zoom) {
273 | this.zoom = zoom.data;
274 | return FlutterMap(
275 | mapController: _controller,
276 | options: MapOptions(
277 | center: _currentPosition ?? _initialCamera,
278 | zoom: 13.0,
279 | maxZoom: 22,
280 | onLongPress: (location) {
281 | markers.clear();
282 | setState(() {});
283 | },
284 | plugins: [
285 | UserLocationPlugin(),
286 | ],
287 | onPositionChanged: (positon, b) {
288 | _zoom.add(_controller.zoom);
289 | },
290 | onTap: (location) {
291 | addMarkerInList(
292 | _buildAnimatedLocationMarker(
293 | color: Color.rgb(Colors.red.red, Colors.red.green,
294 | Colors.red.blue),
295 | colorAccent: Color.rgb(Colors.redAccent.red,
296 | Colors.redAccent.green, Colors.redAccent.blue),
297 | location: location,
298 | ),
299 | );
300 | },
301 | interactive: true,
302 | debug: true,
303 | ),
304 | layers: [
305 | TileLayerOptions(
306 | urlTemplate:
307 | "https://api.mapbox.com/styles/v1/parkingsystem/ckl2tb50f1rh817obnlzr0f0b/tiles/256/{z}/{x}/{y}@2x?access_token={accessToken}",
308 | additionalOptions: {
309 | 'accessToken': APIKeys.map_box_key,
310 | },
311 | subdomains: ['a', 'b', 'c'],
312 | maxZoom: 20,
313 | zoomReverse: true,
314 | ),
315 | MarkerLayerOptions(
316 | markers: markers,
317 | ),
318 | userLocationOptions,
319 | ],
320 | );
321 | });
322 | });
323 | }
324 |
325 | Marker _buildAnimatedLocationMarker({
326 | Color color,
327 | Color colorAccent,
328 | LatLng location,
329 | }) {
330 | // final EndLoopController _controller = EndLoopController("jump", 5);
331 | return Marker(
332 | width: 50,
333 | height: 50,
334 | point:
335 | location ?? _currentPosition ?? _lastKnownPosition ?? _initialCamera,
336 | builder: (ctx) => Center(
337 | child: FlareActor(
338 | "assets/marker.flr",
339 | alignment: Alignment.center,
340 | // controller: _controller,
341 | fit: BoxFit.contain,
342 | isPaused: false,
343 | animation: "jump",
344 | ),
345 | ),
346 | );
347 | }
348 | }
349 |
350 | class NoScalingAnimation extends FloatingActionButtonAnimator {
351 | double _x;
352 | double _y;
353 | @override
354 | Offset getOffset({Offset begin, Offset end, double progress}) {
355 | _x = begin.dx + (end.dx - begin.dx) * progress;
356 | _y = begin.dy + (end.dy - begin.dy) * progress;
357 | return Offset(_x, _y);
358 | }
359 |
360 | @override
361 | Animation getRotationAnimation({Animation parent}) {
362 | return Tween(begin: 1.0, end: 1.0).animate(parent);
363 | }
364 |
365 | @override
366 | Animation getScaleAnimation({Animation parent}) {
367 | return Tween(begin: 1.0, end: 1.0).animate(parent);
368 | }
369 | }
370 | // }
371 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 51;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
16 | 97E5785425D7031600980512 /* Keys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97E5785325D7031600980512 /* Keys.swift */; };
17 | D87EFAD6E9A312E3015D06D7 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 64AE6EEA28AEFCA97D9986AF /* Pods_Runner.framework */; };
18 | /* End PBXBuildFile section */
19 |
20 | /* Begin PBXCopyFilesBuildPhase section */
21 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
22 | isa = PBXCopyFilesBuildPhase;
23 | buildActionMask = 2147483647;
24 | dstPath = "";
25 | dstSubfolderSpec = 10;
26 | files = (
27 | );
28 | name = "Embed Frameworks";
29 | runOnlyForDeploymentPostprocessing = 0;
30 | };
31 | /* End PBXCopyFilesBuildPhase section */
32 |
33 | /* Begin PBXFileReference section */
34 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
35 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
36 | 1ECE4136EB09431622C2B077 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
37 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
38 | 64AE6EEA28AEFCA97D9986AF /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
39 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
40 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
41 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
42 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
43 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
44 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
45 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
46 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
47 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
48 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
49 | 97E5785325D7031600980512 /* Keys.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Keys.swift; sourceTree = ""; };
50 | A4689148D7AA64D76D777155 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
51 | E4746057C32D95A40D483A49 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
52 | /* End PBXFileReference section */
53 |
54 | /* Begin PBXFrameworksBuildPhase section */
55 | 97C146EB1CF9000F007C117D /* Frameworks */ = {
56 | isa = PBXFrameworksBuildPhase;
57 | buildActionMask = 2147483647;
58 | files = (
59 | D87EFAD6E9A312E3015D06D7 /* Pods_Runner.framework in Frameworks */,
60 | );
61 | runOnlyForDeploymentPostprocessing = 0;
62 | };
63 | /* End PBXFrameworksBuildPhase section */
64 |
65 | /* Begin PBXGroup section */
66 | 9740EEB11CF90186004384FC /* Flutter */ = {
67 | isa = PBXGroup;
68 | children = (
69 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
70 | 9740EEB21CF90195004384FC /* Debug.xcconfig */,
71 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
72 | 9740EEB31CF90195004384FC /* Generated.xcconfig */,
73 | );
74 | name = Flutter;
75 | sourceTree = "";
76 | };
77 | 97C146E51CF9000F007C117D = {
78 | isa = PBXGroup;
79 | children = (
80 | 9740EEB11CF90186004384FC /* Flutter */,
81 | 97C146F01CF9000F007C117D /* Runner */,
82 | 97C146EF1CF9000F007C117D /* Products */,
83 | FE001524F19E0F23FC13915A /* Pods */,
84 | F098FBBDDC2F39D8EC600346 /* Frameworks */,
85 | );
86 | sourceTree = "";
87 | };
88 | 97C146EF1CF9000F007C117D /* Products */ = {
89 | isa = PBXGroup;
90 | children = (
91 | 97C146EE1CF9000F007C117D /* Runner.app */,
92 | );
93 | name = Products;
94 | sourceTree = "";
95 | };
96 | 97C146F01CF9000F007C117D /* Runner */ = {
97 | isa = PBXGroup;
98 | children = (
99 | 97E5785325D7031600980512 /* Keys.swift */,
100 | 97C146FA1CF9000F007C117D /* Main.storyboard */,
101 | 97C146FD1CF9000F007C117D /* Assets.xcassets */,
102 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
103 | 97C147021CF9000F007C117D /* Info.plist */,
104 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
105 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
106 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
107 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
108 | );
109 | path = Runner;
110 | sourceTree = "";
111 | };
112 | F098FBBDDC2F39D8EC600346 /* Frameworks */ = {
113 | isa = PBXGroup;
114 | children = (
115 | 64AE6EEA28AEFCA97D9986AF /* Pods_Runner.framework */,
116 | );
117 | name = Frameworks;
118 | sourceTree = "";
119 | };
120 | FE001524F19E0F23FC13915A /* Pods */ = {
121 | isa = PBXGroup;
122 | children = (
123 | A4689148D7AA64D76D777155 /* Pods-Runner.debug.xcconfig */,
124 | E4746057C32D95A40D483A49 /* Pods-Runner.release.xcconfig */,
125 | 1ECE4136EB09431622C2B077 /* Pods-Runner.profile.xcconfig */,
126 | );
127 | path = Pods;
128 | sourceTree = "";
129 | };
130 | /* End PBXGroup section */
131 |
132 | /* Begin PBXNativeTarget section */
133 | 97C146ED1CF9000F007C117D /* Runner */ = {
134 | isa = PBXNativeTarget;
135 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
136 | buildPhases = (
137 | 584A83EF05E1C1FC6A530E5B /* [CP] Check Pods Manifest.lock */,
138 | 9740EEB61CF901F6004384FC /* Run Script */,
139 | 97C146EA1CF9000F007C117D /* Sources */,
140 | 97C146EB1CF9000F007C117D /* Frameworks */,
141 | 97C146EC1CF9000F007C117D /* Resources */,
142 | 9705A1C41CF9048500538489 /* Embed Frameworks */,
143 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
144 | 6322E90F1154AFA8EC5EC6B3 /* [CP] Embed Pods Frameworks */,
145 | 4A46BCF32DB3CDB7AC30BABE /* [CP] Copy Pods Resources */,
146 | );
147 | buildRules = (
148 | );
149 | dependencies = (
150 | );
151 | name = Runner;
152 | productName = Runner;
153 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
154 | productType = "com.apple.product-type.application";
155 | };
156 | /* End PBXNativeTarget section */
157 |
158 | /* Begin PBXProject section */
159 | 97C146E61CF9000F007C117D /* Project object */ = {
160 | isa = PBXProject;
161 | attributes = {
162 | LastUpgradeCheck = 1020;
163 | ORGANIZATIONNAME = "";
164 | TargetAttributes = {
165 | 97C146ED1CF9000F007C117D = {
166 | CreatedOnToolsVersion = 7.3.1;
167 | LastSwiftMigration = 1100;
168 | };
169 | };
170 | };
171 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
172 | compatibilityVersion = "Xcode 9.3";
173 | developmentRegion = en;
174 | hasScannedForEncodings = 0;
175 | knownRegions = (
176 | en,
177 | Base,
178 | );
179 | mainGroup = 97C146E51CF9000F007C117D;
180 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
181 | projectDirPath = "";
182 | projectRoot = "";
183 | targets = (
184 | 97C146ED1CF9000F007C117D /* Runner */,
185 | );
186 | };
187 | /* End PBXProject section */
188 |
189 | /* Begin PBXResourcesBuildPhase section */
190 | 97C146EC1CF9000F007C117D /* Resources */ = {
191 | isa = PBXResourcesBuildPhase;
192 | buildActionMask = 2147483647;
193 | files = (
194 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
195 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
196 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
197 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
198 | );
199 | runOnlyForDeploymentPostprocessing = 0;
200 | };
201 | /* End PBXResourcesBuildPhase section */
202 |
203 | /* Begin PBXShellScriptBuildPhase section */
204 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
205 | isa = PBXShellScriptBuildPhase;
206 | buildActionMask = 2147483647;
207 | files = (
208 | );
209 | inputPaths = (
210 | );
211 | name = "Thin Binary";
212 | outputPaths = (
213 | );
214 | runOnlyForDeploymentPostprocessing = 0;
215 | shellPath = /bin/sh;
216 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
217 | };
218 | 4A46BCF32DB3CDB7AC30BABE /* [CP] Copy Pods Resources */ = {
219 | isa = PBXShellScriptBuildPhase;
220 | buildActionMask = 2147483647;
221 | files = (
222 | );
223 | inputFileListPaths = (
224 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
225 | );
226 | name = "[CP] Copy Pods Resources";
227 | outputFileListPaths = (
228 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
229 | );
230 | runOnlyForDeploymentPostprocessing = 0;
231 | shellPath = /bin/sh;
232 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
233 | showEnvVarsInLog = 0;
234 | };
235 | 584A83EF05E1C1FC6A530E5B /* [CP] Check Pods Manifest.lock */ = {
236 | isa = PBXShellScriptBuildPhase;
237 | buildActionMask = 2147483647;
238 | files = (
239 | );
240 | inputFileListPaths = (
241 | );
242 | inputPaths = (
243 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
244 | "${PODS_ROOT}/Manifest.lock",
245 | );
246 | name = "[CP] Check Pods Manifest.lock";
247 | outputFileListPaths = (
248 | );
249 | outputPaths = (
250 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
251 | );
252 | runOnlyForDeploymentPostprocessing = 0;
253 | shellPath = /bin/sh;
254 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
255 | showEnvVarsInLog = 0;
256 | };
257 | 6322E90F1154AFA8EC5EC6B3 /* [CP] Embed Pods Frameworks */ = {
258 | isa = PBXShellScriptBuildPhase;
259 | buildActionMask = 2147483647;
260 | files = (
261 | );
262 | inputFileListPaths = (
263 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
264 | );
265 | name = "[CP] Embed Pods Frameworks";
266 | outputFileListPaths = (
267 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
268 | );
269 | runOnlyForDeploymentPostprocessing = 0;
270 | shellPath = /bin/sh;
271 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
272 | showEnvVarsInLog = 0;
273 | };
274 | 9740EEB61CF901F6004384FC /* Run Script */ = {
275 | isa = PBXShellScriptBuildPhase;
276 | buildActionMask = 2147483647;
277 | files = (
278 | );
279 | inputPaths = (
280 | );
281 | name = "Run Script";
282 | outputPaths = (
283 | );
284 | runOnlyForDeploymentPostprocessing = 0;
285 | shellPath = /bin/sh;
286 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
287 | };
288 | /* End PBXShellScriptBuildPhase section */
289 |
290 | /* Begin PBXSourcesBuildPhase section */
291 | 97C146EA1CF9000F007C117D /* Sources */ = {
292 | isa = PBXSourcesBuildPhase;
293 | buildActionMask = 2147483647;
294 | files = (
295 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
296 | 97E5785425D7031600980512 /* Keys.swift in Sources */,
297 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
298 | );
299 | runOnlyForDeploymentPostprocessing = 0;
300 | };
301 | /* End PBXSourcesBuildPhase section */
302 |
303 | /* Begin PBXVariantGroup section */
304 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
305 | isa = PBXVariantGroup;
306 | children = (
307 | 97C146FB1CF9000F007C117D /* Base */,
308 | );
309 | name = Main.storyboard;
310 | sourceTree = "";
311 | };
312 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
313 | isa = PBXVariantGroup;
314 | children = (
315 | 97C147001CF9000F007C117D /* Base */,
316 | );
317 | name = LaunchScreen.storyboard;
318 | sourceTree = "";
319 | };
320 | /* End PBXVariantGroup section */
321 |
322 | /* Begin XCBuildConfiguration section */
323 | 249021D3217E4FDB00AE95B9 /* Profile */ = {
324 | isa = XCBuildConfiguration;
325 | buildSettings = {
326 | ALWAYS_SEARCH_USER_PATHS = NO;
327 | CLANG_ANALYZER_NONNULL = YES;
328 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
329 | CLANG_CXX_LIBRARY = "libc++";
330 | CLANG_ENABLE_MODULES = YES;
331 | CLANG_ENABLE_OBJC_ARC = YES;
332 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
333 | CLANG_WARN_BOOL_CONVERSION = YES;
334 | CLANG_WARN_COMMA = YES;
335 | CLANG_WARN_CONSTANT_CONVERSION = YES;
336 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
337 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
338 | CLANG_WARN_EMPTY_BODY = YES;
339 | CLANG_WARN_ENUM_CONVERSION = YES;
340 | CLANG_WARN_INFINITE_RECURSION = YES;
341 | CLANG_WARN_INT_CONVERSION = YES;
342 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
343 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
344 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
345 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
346 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
347 | CLANG_WARN_STRICT_PROTOTYPES = YES;
348 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
349 | CLANG_WARN_UNREACHABLE_CODE = YES;
350 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
351 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
352 | COPY_PHASE_STRIP = NO;
353 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
354 | ENABLE_NS_ASSERTIONS = NO;
355 | ENABLE_STRICT_OBJC_MSGSEND = YES;
356 | GCC_C_LANGUAGE_STANDARD = gnu99;
357 | GCC_NO_COMMON_BLOCKS = YES;
358 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
359 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
360 | GCC_WARN_UNDECLARED_SELECTOR = YES;
361 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
362 | GCC_WARN_UNUSED_FUNCTION = YES;
363 | GCC_WARN_UNUSED_VARIABLE = YES;
364 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
365 | MTL_ENABLE_DEBUG_INFO = NO;
366 | SDKROOT = iphoneos;
367 | SUPPORTED_PLATFORMS = iphoneos;
368 | TARGETED_DEVICE_FAMILY = "1,2";
369 | VALIDATE_PRODUCT = YES;
370 | };
371 | name = Profile;
372 | };
373 | 249021D4217E4FDB00AE95B9 /* Profile */ = {
374 | isa = XCBuildConfiguration;
375 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
376 | buildSettings = {
377 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
378 | CLANG_ENABLE_MODULES = YES;
379 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
380 | ENABLE_BITCODE = NO;
381 | INFOPLIST_FILE = Runner/Info.plist;
382 | LD_RUNPATH_SEARCH_PATHS = (
383 | "$(inherited)",
384 | "@executable_path/Frameworks",
385 | );
386 | PRODUCT_BUNDLE_IDENTIFIER = com.example.theParker;
387 | PRODUCT_NAME = "$(TARGET_NAME)";
388 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
389 | SWIFT_VERSION = 5.0;
390 | VERSIONING_SYSTEM = "apple-generic";
391 | };
392 | name = Profile;
393 | };
394 | 97C147031CF9000F007C117D /* Debug */ = {
395 | isa = XCBuildConfiguration;
396 | buildSettings = {
397 | ALWAYS_SEARCH_USER_PATHS = NO;
398 | CLANG_ANALYZER_NONNULL = YES;
399 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
400 | CLANG_CXX_LIBRARY = "libc++";
401 | CLANG_ENABLE_MODULES = YES;
402 | CLANG_ENABLE_OBJC_ARC = YES;
403 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
404 | CLANG_WARN_BOOL_CONVERSION = YES;
405 | CLANG_WARN_COMMA = YES;
406 | CLANG_WARN_CONSTANT_CONVERSION = YES;
407 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
408 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
409 | CLANG_WARN_EMPTY_BODY = YES;
410 | CLANG_WARN_ENUM_CONVERSION = YES;
411 | CLANG_WARN_INFINITE_RECURSION = YES;
412 | CLANG_WARN_INT_CONVERSION = YES;
413 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
414 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
415 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
416 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
417 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
418 | CLANG_WARN_STRICT_PROTOTYPES = YES;
419 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
420 | CLANG_WARN_UNREACHABLE_CODE = YES;
421 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
422 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
423 | COPY_PHASE_STRIP = NO;
424 | DEBUG_INFORMATION_FORMAT = dwarf;
425 | ENABLE_STRICT_OBJC_MSGSEND = YES;
426 | ENABLE_TESTABILITY = YES;
427 | GCC_C_LANGUAGE_STANDARD = gnu99;
428 | GCC_DYNAMIC_NO_PIC = NO;
429 | GCC_NO_COMMON_BLOCKS = YES;
430 | GCC_OPTIMIZATION_LEVEL = 0;
431 | GCC_PREPROCESSOR_DEFINITIONS = (
432 | "DEBUG=1",
433 | "$(inherited)",
434 | );
435 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
436 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
437 | GCC_WARN_UNDECLARED_SELECTOR = YES;
438 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
439 | GCC_WARN_UNUSED_FUNCTION = YES;
440 | GCC_WARN_UNUSED_VARIABLE = YES;
441 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
442 | MTL_ENABLE_DEBUG_INFO = YES;
443 | ONLY_ACTIVE_ARCH = YES;
444 | SDKROOT = iphoneos;
445 | TARGETED_DEVICE_FAMILY = "1,2";
446 | };
447 | name = Debug;
448 | };
449 | 97C147041CF9000F007C117D /* Release */ = {
450 | isa = XCBuildConfiguration;
451 | buildSettings = {
452 | ALWAYS_SEARCH_USER_PATHS = NO;
453 | CLANG_ANALYZER_NONNULL = YES;
454 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
455 | CLANG_CXX_LIBRARY = "libc++";
456 | CLANG_ENABLE_MODULES = YES;
457 | CLANG_ENABLE_OBJC_ARC = YES;
458 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
459 | CLANG_WARN_BOOL_CONVERSION = YES;
460 | CLANG_WARN_COMMA = YES;
461 | CLANG_WARN_CONSTANT_CONVERSION = YES;
462 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
463 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
464 | CLANG_WARN_EMPTY_BODY = YES;
465 | CLANG_WARN_ENUM_CONVERSION = YES;
466 | CLANG_WARN_INFINITE_RECURSION = YES;
467 | CLANG_WARN_INT_CONVERSION = YES;
468 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
469 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
470 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
471 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
472 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
473 | CLANG_WARN_STRICT_PROTOTYPES = YES;
474 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
475 | CLANG_WARN_UNREACHABLE_CODE = YES;
476 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
477 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
478 | COPY_PHASE_STRIP = NO;
479 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
480 | ENABLE_NS_ASSERTIONS = NO;
481 | ENABLE_STRICT_OBJC_MSGSEND = YES;
482 | GCC_C_LANGUAGE_STANDARD = gnu99;
483 | GCC_NO_COMMON_BLOCKS = YES;
484 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
485 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
486 | GCC_WARN_UNDECLARED_SELECTOR = YES;
487 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
488 | GCC_WARN_UNUSED_FUNCTION = YES;
489 | GCC_WARN_UNUSED_VARIABLE = YES;
490 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
491 | MTL_ENABLE_DEBUG_INFO = NO;
492 | SDKROOT = iphoneos;
493 | SUPPORTED_PLATFORMS = iphoneos;
494 | SWIFT_COMPILATION_MODE = wholemodule;
495 | SWIFT_OPTIMIZATION_LEVEL = "-O";
496 | TARGETED_DEVICE_FAMILY = "1,2";
497 | VALIDATE_PRODUCT = YES;
498 | };
499 | name = Release;
500 | };
501 | 97C147061CF9000F007C117D /* Debug */ = {
502 | isa = XCBuildConfiguration;
503 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
504 | buildSettings = {
505 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
506 | CLANG_ENABLE_MODULES = YES;
507 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
508 | ENABLE_BITCODE = NO;
509 | INFOPLIST_FILE = Runner/Info.plist;
510 | LD_RUNPATH_SEARCH_PATHS = (
511 | "$(inherited)",
512 | "@executable_path/Frameworks",
513 | );
514 | PRODUCT_BUNDLE_IDENTIFIER = com.example.theParker;
515 | PRODUCT_NAME = "$(TARGET_NAME)";
516 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
517 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
518 | SWIFT_VERSION = 5.0;
519 | VERSIONING_SYSTEM = "apple-generic";
520 | };
521 | name = Debug;
522 | };
523 | 97C147071CF9000F007C117D /* Release */ = {
524 | isa = XCBuildConfiguration;
525 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
526 | buildSettings = {
527 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
528 | CLANG_ENABLE_MODULES = YES;
529 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
530 | ENABLE_BITCODE = NO;
531 | INFOPLIST_FILE = Runner/Info.plist;
532 | LD_RUNPATH_SEARCH_PATHS = (
533 | "$(inherited)",
534 | "@executable_path/Frameworks",
535 | );
536 | PRODUCT_BUNDLE_IDENTIFIER = com.example.theParker;
537 | PRODUCT_NAME = "$(TARGET_NAME)";
538 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
539 | SWIFT_VERSION = 5.0;
540 | VERSIONING_SYSTEM = "apple-generic";
541 | };
542 | name = Release;
543 | };
544 | /* End XCBuildConfiguration section */
545 |
546 | /* Begin XCConfigurationList section */
547 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
548 | isa = XCConfigurationList;
549 | buildConfigurations = (
550 | 97C147031CF9000F007C117D /* Debug */,
551 | 97C147041CF9000F007C117D /* Release */,
552 | 249021D3217E4FDB00AE95B9 /* Profile */,
553 | );
554 | defaultConfigurationIsVisible = 0;
555 | defaultConfigurationName = Release;
556 | };
557 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
558 | isa = XCConfigurationList;
559 | buildConfigurations = (
560 | 97C147061CF9000F007C117D /* Debug */,
561 | 97C147071CF9000F007C117D /* Release */,
562 | 249021D4217E4FDB00AE95B9 /* Profile */,
563 | );
564 | defaultConfigurationIsVisible = 0;
565 | defaultConfigurationName = Release;
566 | };
567 | /* End XCConfigurationList section */
568 | };
569 | rootObject = 97C146E61CF9000F007C117D /* Project object */;
570 | }
571 |
--------------------------------------------------------------------------------