├── 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 | --------------------------------------------------------------------------------