├── .flutter-plugins-dependencies ├── .gitignore ├── .metadata ├── LICENSE ├── README.md ├── android ├── app │ ├── build.gradle │ ├── google-services.json │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── net │ │ │ │ └── ithinkdiff │ │ │ │ └── flutter_firebase_vote │ │ │ │ └── MainActivity.java │ │ └── res │ │ │ ├── drawable │ │ │ └── launch_background.xml │ │ │ ├── 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 │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── authentication.png ├── cover.png ├── demo1.jpg ├── demo3.gif ├── firebase_android.png ├── ios ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ ├── Flutter.podspec │ ├── Release.xcconfig │ └── flutter_export_environment.sh ├── Podfile ├── Podfile.lock ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── Runner │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-1024x1024@1x.png │ │ ├── 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-83.5x83.5@2x.png │ └── LaunchImage.imageset │ │ ├── Contents.json │ │ ├── LaunchImage.png │ │ ├── LaunchImage@2x.png │ │ ├── LaunchImage@3x.png │ │ └── README.md │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── GoogleService-Info.plist │ ├── Info.plist │ └── main.m ├── lib ├── constants.dart ├── main.dart ├── models │ └── vote.dart ├── screens │ ├── home_screen.dart │ ├── launch_screen.dart │ └── result_screen.dart ├── services │ ├── authentication.dart │ ├── constants.dart │ └── services.dart ├── state │ ├── authentication.dart │ └── vote.dart ├── utilities.dart └── widgets │ ├── shared_widgets.dart │ ├── vote.dart │ └── vote_list.dart ├── pubspec.lock ├── pubspec.yaml ├── resource └── model.drawio └── test └── widget_test.dart /.flutter-plugins-dependencies: -------------------------------------------------------------------------------- 1 | {"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"cloud_firestore","path":"/Users/mahmud/Home/Flutter/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore-0.13.6/","dependencies":["firebase_core"]},{"name":"firebase_auth","path":"/Users/mahmud/Home/Flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth-0.16.1/","dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/mahmud/Home/Flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-0.4.5/","dependencies":[]},{"name":"google_sign_in","path":"/Users/mahmud/Home/Flutter/flutter/.pub-cache/hosted/pub.dartlang.org/google_sign_in-4.5.1/","dependencies":[]}],"android":[{"name":"cloud_firestore","path":"/Users/mahmud/Home/Flutter/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore-0.13.6/","dependencies":["firebase_core"]},{"name":"firebase_auth","path":"/Users/mahmud/Home/Flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth-0.16.1/","dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/mahmud/Home/Flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-0.4.5/","dependencies":[]},{"name":"google_sign_in","path":"/Users/mahmud/Home/Flutter/flutter/.pub-cache/hosted/pub.dartlang.org/google_sign_in-4.5.1/","dependencies":[]}],"macos":[{"name":"cloud_firestore","path":"/Users/mahmud/Home/Flutter/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore-0.13.6/","dependencies":["firebase_core"]},{"name":"firebase_auth","path":"/Users/mahmud/Home/Flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth-0.16.1/","dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/mahmud/Home/Flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-0.4.5/","dependencies":[]}],"linux":[],"windows":[],"web":[{"name":"cloud_firestore_web","path":"/Users/mahmud/Home/Flutter/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore_web-0.1.1+2/","dependencies":[]},{"name":"firebase_auth_web","path":"/Users/mahmud/Home/Flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth_web-0.1.3+1/","dependencies":[]},{"name":"firebase_core_web","path":"/Users/mahmud/Home/Flutter/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-0.1.1+2/","dependencies":[]},{"name":"google_sign_in_web","path":"/Users/mahmud/Home/Flutter/flutter/.pub-cache/hosted/pub.dartlang.org/google_sign_in_web-0.9.1+1/","dependencies":[]}]},"dependencyGraph":[{"name":"cloud_firestore","dependencies":["firebase_core","cloud_firestore_web"]},{"name":"cloud_firestore_web","dependencies":["firebase_core"]},{"name":"firebase_auth","dependencies":["firebase_core","firebase_auth_web"]},{"name":"firebase_auth_web","dependencies":[]},{"name":"firebase_core","dependencies":["firebase_core_web"]},{"name":"firebase_core_web","dependencies":[]},{"name":"google_sign_in","dependencies":["google_sign_in_web"]},{"name":"google_sign_in_web","dependencies":[]}],"date_created":"2020-05-27 14:20:19.479949","version":"1.17.1"} -------------------------------------------------------------------------------- /.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 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | .dart_tool/ 26 | .flutter-plugins 27 | .packages 28 | .pub-cache/ 29 | .pub/ 30 | /build/ 31 | 32 | # Android related 33 | **/android/**/gradle-wrapper.jar 34 | **/android/.gradle 35 | **/android/captures/ 36 | **/android/gradlew 37 | **/android/gradlew.bat 38 | **/android/local.properties 39 | **/android/**/GeneratedPluginRegistrant.java 40 | 41 | # iOS/XCode related 42 | **/ios/**/*.mode1v3 43 | **/ios/**/*.mode2v3 44 | **/ios/**/*.moved-aside 45 | **/ios/**/*.pbxuser 46 | **/ios/**/*.perspectivev3 47 | **/ios/**/*sync/ 48 | **/ios/**/.sconsign.dblite 49 | **/ios/**/.tags* 50 | **/ios/**/.vagrant/ 51 | **/ios/**/DerivedData/ 52 | **/ios/**/Icon? 53 | **/ios/**/Pods/ 54 | **/ios/**/.symlinks/ 55 | **/ios/**/profile 56 | **/ios/**/xcuserdata 57 | **/ios/.generated/ 58 | **/ios/Flutter/App.framework 59 | **/ios/Flutter/Flutter.framework 60 | **/ios/Flutter/Generated.xcconfig 61 | **/ios/Flutter/app.flx 62 | **/ios/Flutter/app.zip 63 | **/ios/Flutter/flutter_assets/ 64 | **/ios/ServiceDefinitions.json 65 | **/ios/Runner/GeneratedPluginRegistrant.* 66 | 67 | # Exceptions to above rules. 68 | !**/ios/**/default.mode1v3 69 | !**/ios/**/default.mode2v3 70 | !**/ios/**/default.pbxuser 71 | !**/ios/**/default.perspectivev3 72 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 73 | -------------------------------------------------------------------------------- /.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: 20e59316b8b8474554b38493b8ca888794b0234a 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Mahmud Ahsan 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | Flutter 3 |

4 |

5 | 6 | Youtube 7 | 8 | 9 | ithinkdiff.net 10 | 11 | 12 | Twitter: @mahmudahsan 13 | 14 |

15 | 16 | 17 | # Vote - A full Flutter Application 18 | - [Video Tutorial 1: Building the app](https://www.youtube.com/watch?v=Iu9DpbzR83s) 19 | - [Video Tutorial 2: Add Firebase Authentication and Firestore Database](https://youtu.be/N6DF-zz9c6o) 20 | - [Video Tutorial 3: Migrating Provider 4.0 and Fix Android Firebase Authentication issues](https://www.youtube.com/watch?v=8W8zT0MKLWk) 21 | 22 | > - [Migration to Provider 4.0](#migration-to-provider-4) 23 | > - [Firebase configuration for android](#firebase-configuration-for-android) 24 | 25 | > A flutter and firebase based vote application. 26 | For state management we used, [Provider](https://pub.dev/packages/provider). 27 | 28 | > If you need to know how to use [Provider](https://pub.dev/packages/provider), please 29 | > - [How to use Provider 3.0](https://www.youtube.com/watch?v=fEIdWV8MAso) 30 | > - [Migrating Provider 3 to 4](https://youtu.be/xR-2rM_99-E) 31 | 32 | ### Demo 2.0 33 | 34 |

35 | Firebase auth 36 |

37 | 38 |

39 | Demo 40 |

41 | 42 | ### Features and Updates 43 | > Version 3.0 44 | > 1. Provider library updated to version 4.0 45 | > 2. All other 3rd party libraries updated 46 | > 3. All related app code updated to support provider 4.0 47 | > 4. Android auth fix in firebase and in config 48 | 49 | > Version 2.0 50 | > 1. User can sign in 51 | > 2. User can see vote List from Firebase 52 | > 3. User can vote 53 | > 4. User can see result 54 | 55 | ### Authentication Flow Chart 56 |

57 | authentication 58 |

59 | 60 | ### Migration to Provider 4 61 | - [Update Provider 3.0 to 4.0](https://pub.dev/packages/provider) 62 | - [Changes committed](https://github.com/mahmudahsan/flutter_firebase_vote/commit/0f82330911cb3b4b398488cf00dbf5a7b4ada337) 63 | 64 | ### Firebase configuration for android 65 | ***Sometimes firebase and google auth doesn't work on Android Emulators, so preferred way to to test in a real device*** 66 | 67 | > Firebase authentication is very critical for android. If you don't do the following things the app will not work on android. Also if you found any error, search in Google. 68 | 69 | > To know more about how to add ***Firebase Auth, Google Auth and Firestore*** in a Flutter app [check the video tutorial](https://youtu.be/N6DF-zz9c6o) 70 | 71 | - Update all 3rd party libraries in pubspec.yaml 72 | - Add android app in the firebase. To change or know the android application id open the file `android/app/build.gradle` or check from `android/app/src/main/AndroidManifest.xml` to get the application id 73 | - Download `google-service.json` file from firebase 74 | 75 |

76 | Firebase auth 77 |

78 | 79 | - Copy `google-service.json` file and put it `android/app/google-service.json` 80 | - Update `android/build.gradle` by adding `multiDexEnabled true` to `defaultConfig` 81 | ``` 82 | defaultConfig { 83 | multiDexEnabled true 84 | } 85 | ``` 86 | - Update `android/gradle.properties` if you already didn't migrated https://flutter.dev/docs/development/androidx-migration 87 | ``` 88 | android.useAndroidX=true 89 | android.enableJetifier=true 90 | ``` 91 | - update android/build.gradle to latest versions 92 | ``` 93 | dependencies { 94 | classpath 'com.android.tools.build:gradle:3.6.3' 95 | classpath 'com.google.gms:google-services:4.3.3' 96 | } 97 | ``` 98 | - Update distributionUrl to latest `android/gradle/wrapper/gradle-wrapper.properties` 99 | ``` 100 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip 101 | ``` 102 | - Android Google Sign In. Run the following command generate SHA-1 and SHA-256 keys and add in Firebase 103 | https://stackoverflow.com/questions/15727912/sha-1-fingerprint-of-keystore-certificate 104 | ``` 105 | keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android 106 | ``` 107 |

108 | Firebase auth 109 |

110 | 111 | ### Widgets 112 | 113 | > [Widget Index](https://flutter.dev/docs/reference/widgets) 114 | 115 | - [Stepper Class](https://api.flutter.dev/flutter/material/Stepper-class.html) 116 | - [MaterialApp](https://api.flutter.dev/flutter/material/MaterialApp-class.html) 117 | - [Scaffold](https://api.flutter.dev/flutter/material/Scaffold-class.html) 118 | - [Container](https://api.flutter.dev/flutter/widgets/Container-class.html) 119 | - [Column](https://api.flutter.dev/flutter/widgets/Column-class.html) 120 | - [Row](https://api.flutter.dev/flutter/widgets/Row-class.html) 121 | - [Expanded](https://api.flutter.dev/flutter/widgets/Expanded-class.html) 122 | - [LimitedBox](https://api.flutter.dev/flutter/widgets/LimitedBox-class.html) 123 | - [IntrinsicHeight](https://api.flutter.dev/flutter/widgets/IntrinsicHeight-class.html) 124 | - [InkWell](https://api.flutter.dev/flutter/material/InkWell-class.html) 125 | 126 | 127 | ### 3rd Party Libraries 128 | 129 | - [UUID](https://pub.dev/packages/uuid) 130 | - [Provider](https://pub.dev/packages/provider) 131 | - [Charts Flutter](https://pub.dev/packages/charts_flutter) 132 | - [Chart Gallery](https://google.github.io/charts/flutter/gallery.html) 133 | - [Firebase Auth](https://pub.dev/packages/firebase_auth) 134 | - [Firebase Setup](https://firebase.google.com/docs/flutter/setup) 135 | - [Google Sign In](https://pub.dev/packages/google_sign_in) 136 | - [Firebase Plugins](https://github.com/FirebaseExtended/flutterfire) 137 | - [Cloud Firestore](https://pub.dev/packages/cloud_firestore) 138 | - [Loading](https://pub.dev/packages/loading) 139 | 140 | 141 | ### Tutorials 142 | 1. [Youtube - Flutter Playlist 1](https://www.youtube.com/playlist?list=PLlMOodDAsO4xrTgVEkKXfVf7sSVEsmWKQ) 143 | 2. [Youtube - Flutter Playlist 2](https://www.youtube.com/playlist?list=PLlMOodDAsO4zQ243zMHKKrV316PJU9q0E) 144 | 145 | ### Flutter Full Application 146 | 1. [Vote](https://git.io/JeRjb) | [Tutorial](https://www.youtube.com/watch?v=Iu9DpbzR83s&list=PLlMOodDAsO4zQ243zMHKKrV316PJU9q0E&index=2&t=0s) 147 | 2. [Todos](https://github.com/mahmudahsan/flutter_todos) | [Tutorial](https://youtu.be/OQG3MxenJsM) 148 | 149 | ### Flutter Tutorials Beginners 150 | 1. [Dart Programming Language for Beginners](https://www.youtube.com/watch?v=Ej_Pcr4uC2Q&list=PLlMOodDAsO4xrTgVEkKXfVf7sSVEsmWKQ&index=2&t=10s) 151 | 2. [Flutter for Beginners - Creating First App](https://www.youtube.com/watch?v=HFl29MoZ6MA&list=PLlMOodDAsO4xrTgVEkKXfVf7sSVEsmWKQ&index=3&t=0s) 152 | 3. [How to Create a Profile Page App](https://www.youtube.com/watch?v=ULxYR66BRb4&list=PLlMOodDAsO4xrTgVEkKXfVf7sSVEsmWKQ&index=5&t=0s) 153 | 154 | ### Flutter Tutorials Managing States 155 | 156 | 1. [Stateful Widget](https://www.youtube.com/watch?v=8iHfqfHclTQ&list=PLlMOodDAsO4xrTgVEkKXfVf7sSVEsmWKQ&index=17&t=0s) 157 | 2. [State: Provider](https://git.io/Je4ZP) | [Tutorial](https://www.youtube.com/watch?v=fEIdWV8MAso) 158 | 3. [State: Redux](https://git.io/Je4Z6) | [Tutorial](https://www.youtube.com/watch?v=vzCszJQ_qZQ&t=793s) 159 | 4. [State: Bloc](https://git.io/Je4s5) | [Tutorial](https://youtu.be/BHC_D52TecY) 160 | 161 | ### Flutter Mixed 162 | - [Form](flutter/form) | [Tutorial](https://www.youtube.com/watch?v=S-nLT3TRJFY&t=1646s) 163 | 164 | ### Quick Reference 165 | 166 | 1. [Dart Language](https://github.com/mahmudahsan/flutter/tree/master/dart) | [Video](https://www.youtube.com/watch?v=Ej_Pcr4uC2Q&list=PLlMOodDAsO4xrTgVEkKXfVf7sSVEsmWKQ&index=3) 167 | 2. [Flutter](https://github.com/mahmudahsan/flutter/tree/master/flutter) | [Video](https://www.youtube.com/playlist?list=PLlMOodDAsO4xrTgVEkKXfVf7sSVEsmWKQ) 168 | 169 | ### Resources 170 | 171 | - [Official Site](https://flutter.dev/) 172 | - [Widget Category](https://flutter.dev/docs/reference/widgets) 173 | - [Pub.Dev](https://pub.dev/) 174 | 175 | 176 | ## Support 177 | If it helps you, please give a ***star*** in this repo. Also you can support me by subscribing my [youtube channel](https://www.youtube.com/channel/UCtHlgyUw0wLE5Ous9swfFlg). 178 | 179 | ## Questions or feedback? 180 | 181 | Feel free to open an issue, or find me [@mahmudahsan on Twitter](https://twitter.com/mahmudahsan). 182 | -------------------------------------------------------------------------------- /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 from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 26 | 27 | android { 28 | compileSdkVersion 28 29 | 30 | lintOptions { 31 | disable 'InvalidPackage' 32 | } 33 | 34 | defaultConfig { 35 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 36 | applicationId "net.ithinkdiff.flutter_firebase_vote" 37 | minSdkVersion 16 38 | targetSdkVersion 28 39 | versionCode flutterVersionCode.toInteger() 40 | versionName flutterVersionName 41 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 42 | multiDexEnabled true 43 | } 44 | 45 | buildTypes { 46 | release { 47 | // TODO: Add your own signing config for the release build. 48 | // Signing with the debug keys for now, so `flutter run --release` works. 49 | signingConfig signingConfigs.debug 50 | } 51 | } 52 | } 53 | 54 | flutter { 55 | source '../..' 56 | } 57 | 58 | dependencies { 59 | testImplementation 'junit:junit:4.12' 60 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 61 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 62 | } 63 | 64 | apply plugin: 'com.google.gms.google-services' -------------------------------------------------------------------------------- /android/app/google-services.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_info": { 3 | "project_number": "694052778285", 4 | "firebase_url": "https://vote-prep.firebaseio.com", 5 | "project_id": "vote-prep", 6 | "storage_bucket": "vote-prep.appspot.com" 7 | }, 8 | "client": [ 9 | { 10 | "client_info": { 11 | "mobilesdk_app_id": "1:694052778285:android:bd3d602fb600de006923a4", 12 | "android_client_info": { 13 | "package_name": "net.ithinkdiff.flutter_firebase_vote" 14 | } 15 | }, 16 | "oauth_client": [ 17 | { 18 | "client_id": "694052778285-ri25lvbqf198gsu0lt7lseerc651rn3p.apps.googleusercontent.com", 19 | "client_type": 3 20 | } 21 | ], 22 | "api_key": [ 23 | { 24 | "current_key": "AIzaSyC0wJqTlrZltTy7TkHGEMK3tyzpx818JCw" 25 | } 26 | ], 27 | "services": { 28 | "appinvite_service": { 29 | "other_platform_oauth_client": [ 30 | { 31 | "client_id": "694052778285-ri25lvbqf198gsu0lt7lseerc651rn3p.apps.googleusercontent.com", 32 | "client_type": 3 33 | }, 34 | { 35 | "client_id": "694052778285-lfdh5fnfdjl6p9n5h6f7av7ttl467nrp.apps.googleusercontent.com", 36 | "client_type": 2, 37 | "ios_info": { 38 | "bundle_id": "net.ithinkdiff.vote-prep" 39 | } 40 | } 41 | ] 42 | } 43 | } 44 | } 45 | ], 46 | "configuration_version": "1" 47 | } -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 9 | 13 | 20 | 24 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /android/app/src/main/java/net/ithinkdiff/flutter_firebase_vote/MainActivity.java: -------------------------------------------------------------------------------- 1 | package net.ithinkdiff.flutter_firebase_vote; 2 | 3 | import android.os.Bundle; 4 | import io.flutter.app.FlutterActivity; 5 | import io.flutter.plugins.GeneratedPluginRegistrant; 6 | 7 | public class MainActivity extends FlutterActivity { 8 | @Override 9 | protected void onCreate(Bundle savedInstanceState) { 10 | super.onCreate(savedInstanceState); 11 | GeneratedPluginRegistrant.registerWith(this); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | google() 4 | jcenter() 5 | } 6 | 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:3.6.3' 9 | classpath 'com.google.gms:google-services:4.3.3' 10 | } 11 | } 12 | 13 | allprojects { 14 | repositories { 15 | google() 16 | jcenter() 17 | } 18 | } 19 | 20 | rootProject.buildDir = '../build' 21 | subprojects { 22 | project.buildDir = "${rootProject.buildDir}/${project.name}" 23 | } 24 | subprojects { 25 | project.evaluationDependsOn(':app') 26 | } 27 | 28 | task clean(type: Delete) { 29 | delete rootProject.buildDir 30 | } 31 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | 3 | android.enableR8=true 4 | android.useAndroidX=true 5 | android.enableJetifier=true -------------------------------------------------------------------------------- /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-5.6.4-all.zip 7 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() 4 | 5 | def plugins = new Properties() 6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') 7 | if (pluginsFile.exists()) { 8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } 9 | } 10 | 11 | plugins.each { name, path -> 12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() 13 | include ":$name" 14 | project(":$name").projectDir = pluginDirectory 15 | } 16 | -------------------------------------------------------------------------------- /authentication.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/authentication.png -------------------------------------------------------------------------------- /cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/cover.png -------------------------------------------------------------------------------- /demo1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/demo1.jpg -------------------------------------------------------------------------------- /demo3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/demo3.gif -------------------------------------------------------------------------------- /firebase_android.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/firebase_android.png -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 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/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Flutter/Flutter.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # NOTE: This podspec is NOT to be published. It is only used as a local source! 3 | # 4 | 5 | Pod::Spec.new do |s| 6 | s.name = 'Flutter' 7 | s.version = '1.0.0' 8 | s.summary = 'High-performance, high-fidelity mobile apps.' 9 | s.description = <<-DESC 10 | Flutter provides an easy and productive way to build and deploy high-performance mobile apps for Android and iOS. 11 | DESC 12 | s.homepage = 'https://flutter.io' 13 | s.license = { :type => 'MIT' } 14 | s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } 15 | s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s } 16 | s.ios.deployment_target = '8.0' 17 | s.vendored_frameworks = 'Flutter.framework' 18 | end 19 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /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/mahmud/Home/Flutter/flutter" 4 | export "FLUTTER_APPLICATION_PATH=/Users/mahmud/Home/ithinkdiff/open_source/Flutter-projects/flutter_firebase_vote" 5 | export "FLUTTER_TARGET=/Users/mahmud/Home/ithinkdiff/open_source/Flutter-projects/flutter_firebase_vote/lib/main.dart" 6 | export "FLUTTER_BUILD_DIR=build" 7 | export "SYMROOT=${SOURCE_ROOT}/../build/ios" 8 | export "OTHER_LDFLAGS=$(inherited) -framework Flutter" 9 | export "FLUTTER_FRAMEWORK_DIR=/Users/mahmud/Home/Flutter/flutter/bin/cache/artifacts/engine/ios" 10 | export "FLUTTER_BUILD_NAME=1.0.0" 11 | export "FLUTTER_BUILD_NUMBER=1" 12 | export "TRACK_WIDGET_CREATION=true" 13 | -------------------------------------------------------------------------------- /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 parse_KV_file(file, separator='=') 14 | file_abs_path = File.expand_path(file) 15 | if !File.exists? file_abs_path 16 | return []; 17 | end 18 | generated_key_values = {} 19 | skip_line_start_symbols = ["#", "/"] 20 | File.foreach(file_abs_path) do |line| 21 | next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } 22 | plugin = line.split(pattern=separator) 23 | if plugin.length == 2 24 | podname = plugin[0].strip() 25 | path = plugin[1].strip() 26 | podpath = File.expand_path("#{path}", file_abs_path) 27 | generated_key_values[podname] = podpath 28 | else 29 | puts "Invalid plugin specification: #{line}" 30 | end 31 | end 32 | generated_key_values 33 | end 34 | 35 | target 'Runner' do 36 | # Flutter Pod 37 | 38 | copied_flutter_dir = File.join(__dir__, 'Flutter') 39 | copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework') 40 | copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec') 41 | unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path) 42 | # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet. 43 | # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration. 44 | # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist. 45 | 46 | generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig') 47 | unless File.exist?(generated_xcode_build_settings_path) 48 | raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first" 49 | end 50 | generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path) 51 | cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR']; 52 | 53 | unless File.exist?(copied_framework_path) 54 | FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir) 55 | end 56 | unless File.exist?(copied_podspec_path) 57 | FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir) 58 | end 59 | end 60 | 61 | # Keep pod path relative so it can be checked into Podfile.lock. 62 | pod 'Flutter', :path => 'Flutter' 63 | 64 | # Plugin Pods 65 | 66 | # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock 67 | # referring to absolute paths on developers' machines. 68 | system('rm -rf .symlinks') 69 | system('mkdir -p .symlinks/plugins') 70 | plugin_pods = parse_KV_file('../.flutter-plugins') 71 | plugin_pods.each do |name, path| 72 | symlink = File.join('.symlinks', 'plugins', name) 73 | File.symlink(path, symlink) 74 | pod name, :path => File.join(symlink, 'ios') 75 | end 76 | end 77 | 78 | post_install do |installer| 79 | installer.pods_project.targets.each do |target| 80 | target.build_configurations.each do |config| 81 | config.build_settings['ENABLE_BITCODE'] = 'NO' 82 | end 83 | end 84 | end 85 | -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - abseil/algorithm (0.20200225.0): 3 | - abseil/algorithm/algorithm (= 0.20200225.0) 4 | - abseil/algorithm/container (= 0.20200225.0) 5 | - abseil/algorithm/algorithm (0.20200225.0): 6 | - abseil/base/config 7 | - abseil/algorithm/container (0.20200225.0): 8 | - abseil/algorithm/algorithm 9 | - abseil/base/core_headers 10 | - abseil/meta/type_traits 11 | - abseil/base (0.20200225.0): 12 | - abseil/base/atomic_hook (= 0.20200225.0) 13 | - abseil/base/base (= 0.20200225.0) 14 | - abseil/base/base_internal (= 0.20200225.0) 15 | - abseil/base/bits (= 0.20200225.0) 16 | - abseil/base/config (= 0.20200225.0) 17 | - abseil/base/core_headers (= 0.20200225.0) 18 | - abseil/base/dynamic_annotations (= 0.20200225.0) 19 | - abseil/base/endian (= 0.20200225.0) 20 | - abseil/base/errno_saver (= 0.20200225.0) 21 | - abseil/base/exponential_biased (= 0.20200225.0) 22 | - abseil/base/log_severity (= 0.20200225.0) 23 | - abseil/base/malloc_internal (= 0.20200225.0) 24 | - abseil/base/periodic_sampler (= 0.20200225.0) 25 | - abseil/base/pretty_function (= 0.20200225.0) 26 | - abseil/base/raw_logging_internal (= 0.20200225.0) 27 | - abseil/base/spinlock_wait (= 0.20200225.0) 28 | - abseil/base/throw_delegate (= 0.20200225.0) 29 | - abseil/base/atomic_hook (0.20200225.0): 30 | - abseil/base/config 31 | - abseil/base/core_headers 32 | - abseil/base/base (0.20200225.0): 33 | - abseil/base/atomic_hook 34 | - abseil/base/base_internal 35 | - abseil/base/config 36 | - abseil/base/core_headers 37 | - abseil/base/dynamic_annotations 38 | - abseil/base/log_severity 39 | - abseil/base/raw_logging_internal 40 | - abseil/base/spinlock_wait 41 | - abseil/meta/type_traits 42 | - abseil/base/base_internal (0.20200225.0): 43 | - abseil/base/config 44 | - abseil/meta/type_traits 45 | - abseil/base/bits (0.20200225.0): 46 | - abseil/base/config 47 | - abseil/base/core_headers 48 | - abseil/base/config (0.20200225.0) 49 | - abseil/base/core_headers (0.20200225.0): 50 | - abseil/base/config 51 | - abseil/base/dynamic_annotations (0.20200225.0) 52 | - abseil/base/endian (0.20200225.0): 53 | - abseil/base/config 54 | - abseil/base/core_headers 55 | - abseil/base/errno_saver (0.20200225.0): 56 | - abseil/base/config 57 | - abseil/base/exponential_biased (0.20200225.0): 58 | - abseil/base/config 59 | - abseil/base/core_headers 60 | - abseil/base/log_severity (0.20200225.0): 61 | - abseil/base/config 62 | - abseil/base/core_headers 63 | - abseil/base/malloc_internal (0.20200225.0): 64 | - abseil/base/base 65 | - abseil/base/base_internal 66 | - abseil/base/config 67 | - abseil/base/core_headers 68 | - abseil/base/dynamic_annotations 69 | - abseil/base/raw_logging_internal 70 | - abseil/base/periodic_sampler (0.20200225.0): 71 | - abseil/base/core_headers 72 | - abseil/base/exponential_biased 73 | - abseil/base/pretty_function (0.20200225.0) 74 | - abseil/base/raw_logging_internal (0.20200225.0): 75 | - abseil/base/atomic_hook 76 | - abseil/base/config 77 | - abseil/base/core_headers 78 | - abseil/base/log_severity 79 | - abseil/base/spinlock_wait (0.20200225.0): 80 | - abseil/base/base_internal 81 | - abseil/base/core_headers 82 | - abseil/base/errno_saver 83 | - abseil/base/throw_delegate (0.20200225.0): 84 | - abseil/base/config 85 | - abseil/base/raw_logging_internal 86 | - abseil/container/compressed_tuple (0.20200225.0): 87 | - abseil/utility/utility 88 | - abseil/container/inlined_vector (0.20200225.0): 89 | - abseil/algorithm/algorithm 90 | - abseil/base/core_headers 91 | - abseil/base/throw_delegate 92 | - abseil/container/inlined_vector_internal 93 | - abseil/memory/memory 94 | - abseil/container/inlined_vector_internal (0.20200225.0): 95 | - abseil/base/core_headers 96 | - abseil/container/compressed_tuple 97 | - abseil/memory/memory 98 | - abseil/meta/type_traits 99 | - abseil/types/span 100 | - abseil/memory (0.20200225.0): 101 | - abseil/memory/memory (= 0.20200225.0) 102 | - abseil/memory/memory (0.20200225.0): 103 | - abseil/base/core_headers 104 | - abseil/meta/type_traits 105 | - abseil/meta (0.20200225.0): 106 | - abseil/meta/type_traits (= 0.20200225.0) 107 | - abseil/meta/type_traits (0.20200225.0): 108 | - abseil/base/config 109 | - abseil/numeric/int128 (0.20200225.0): 110 | - abseil/base/config 111 | - abseil/base/core_headers 112 | - abseil/strings/internal (0.20200225.0): 113 | - abseil/base/config 114 | - abseil/base/core_headers 115 | - abseil/base/endian 116 | - abseil/base/raw_logging_internal 117 | - abseil/meta/type_traits 118 | - abseil/strings/str_format (0.20200225.0): 119 | - abseil/strings/str_format_internal 120 | - abseil/strings/str_format_internal (0.20200225.0): 121 | - abseil/base/config 122 | - abseil/base/core_headers 123 | - abseil/meta/type_traits 124 | - abseil/numeric/int128 125 | - abseil/strings/strings 126 | - abseil/types/span 127 | - abseil/strings/strings (0.20200225.0): 128 | - abseil/base/base 129 | - abseil/base/bits 130 | - abseil/base/config 131 | - abseil/base/core_headers 132 | - abseil/base/endian 133 | - abseil/base/raw_logging_internal 134 | - abseil/base/throw_delegate 135 | - abseil/memory/memory 136 | - abseil/meta/type_traits 137 | - abseil/numeric/int128 138 | - abseil/strings/internal 139 | - abseil/time (0.20200225.0): 140 | - abseil/time/internal (= 0.20200225.0) 141 | - abseil/time/time (= 0.20200225.0) 142 | - abseil/time/internal (0.20200225.0): 143 | - abseil/time/internal/cctz (= 0.20200225.0) 144 | - abseil/time/internal/cctz (0.20200225.0): 145 | - abseil/time/internal/cctz/civil_time (= 0.20200225.0) 146 | - abseil/time/internal/cctz/time_zone (= 0.20200225.0) 147 | - abseil/time/internal/cctz/civil_time (0.20200225.0): 148 | - abseil/base/config 149 | - abseil/time/internal/cctz/time_zone (0.20200225.0): 150 | - abseil/base/config 151 | - abseil/time/internal/cctz/civil_time 152 | - abseil/time/time (0.20200225.0): 153 | - abseil/base/base 154 | - abseil/base/core_headers 155 | - abseil/base/raw_logging_internal 156 | - abseil/numeric/int128 157 | - abseil/strings/strings 158 | - abseil/time/internal/cctz/civil_time 159 | - abseil/time/internal/cctz/time_zone 160 | - abseil/types (0.20200225.0): 161 | - abseil/types/any (= 0.20200225.0) 162 | - abseil/types/bad_any_cast (= 0.20200225.0) 163 | - abseil/types/bad_any_cast_impl (= 0.20200225.0) 164 | - abseil/types/bad_optional_access (= 0.20200225.0) 165 | - abseil/types/bad_variant_access (= 0.20200225.0) 166 | - abseil/types/compare (= 0.20200225.0) 167 | - abseil/types/optional (= 0.20200225.0) 168 | - abseil/types/span (= 0.20200225.0) 169 | - abseil/types/variant (= 0.20200225.0) 170 | - abseil/types/any (0.20200225.0): 171 | - abseil/base/config 172 | - abseil/base/core_headers 173 | - abseil/meta/type_traits 174 | - abseil/types/bad_any_cast 175 | - abseil/utility/utility 176 | - abseil/types/bad_any_cast (0.20200225.0): 177 | - abseil/base/config 178 | - abseil/types/bad_any_cast_impl 179 | - abseil/types/bad_any_cast_impl (0.20200225.0): 180 | - abseil/base/config 181 | - abseil/base/raw_logging_internal 182 | - abseil/types/bad_optional_access (0.20200225.0): 183 | - abseil/base/config 184 | - abseil/base/raw_logging_internal 185 | - abseil/types/bad_variant_access (0.20200225.0): 186 | - abseil/base/config 187 | - abseil/base/raw_logging_internal 188 | - abseil/types/compare (0.20200225.0): 189 | - abseil/base/core_headers 190 | - abseil/meta/type_traits 191 | - abseil/types/optional (0.20200225.0): 192 | - abseil/base/base_internal 193 | - abseil/base/config 194 | - abseil/base/core_headers 195 | - abseil/memory/memory 196 | - abseil/meta/type_traits 197 | - abseil/types/bad_optional_access 198 | - abseil/utility/utility 199 | - abseil/types/span (0.20200225.0): 200 | - abseil/algorithm/algorithm 201 | - abseil/base/core_headers 202 | - abseil/base/throw_delegate 203 | - abseil/meta/type_traits 204 | - abseil/types/variant (0.20200225.0): 205 | - abseil/base/base_internal 206 | - abseil/base/config 207 | - abseil/base/core_headers 208 | - abseil/meta/type_traits 209 | - abseil/types/bad_variant_access 210 | - abseil/utility/utility 211 | - abseil/utility/utility (0.20200225.0): 212 | - abseil/base/base_internal 213 | - abseil/base/config 214 | - abseil/meta/type_traits 215 | - AppAuth (1.3.0): 216 | - AppAuth/Core (= 1.3.0) 217 | - AppAuth/ExternalUserAgent (= 1.3.0) 218 | - AppAuth/Core (1.3.0) 219 | - AppAuth/ExternalUserAgent (1.3.0) 220 | - BoringSSL-GRPC (0.0.7): 221 | - BoringSSL-GRPC/Implementation (= 0.0.7) 222 | - BoringSSL-GRPC/Interface (= 0.0.7) 223 | - BoringSSL-GRPC/Implementation (0.0.7): 224 | - BoringSSL-GRPC/Interface (= 0.0.7) 225 | - BoringSSL-GRPC/Interface (0.0.7) 226 | - cloud_firestore (0.0.1): 227 | - Firebase/Core 228 | - Firebase/Firestore (~> 6.0) 229 | - Flutter 230 | - cloud_firestore_web (0.1.0): 231 | - Flutter 232 | - Firebase/Auth (6.24.0): 233 | - Firebase/CoreOnly 234 | - FirebaseAuth (~> 6.5.3) 235 | - Firebase/Core (6.24.0): 236 | - Firebase/CoreOnly 237 | - FirebaseAnalytics (= 6.5.0) 238 | - Firebase/CoreOnly (6.24.0): 239 | - FirebaseCore (= 6.7.0) 240 | - Firebase/Firestore (6.24.0): 241 | - Firebase/CoreOnly 242 | - FirebaseFirestore (~> 1.13.0) 243 | - firebase_auth (0.0.1): 244 | - Firebase/Auth (~> 6.3) 245 | - Firebase/Core 246 | - Flutter 247 | - firebase_auth_web (0.1.0): 248 | - Flutter 249 | - firebase_core (0.0.1): 250 | - Firebase/Core 251 | - Flutter 252 | - firebase_core_web (0.1.0): 253 | - Flutter 254 | - FirebaseAnalytics (6.5.0): 255 | - FirebaseCore (~> 6.7) 256 | - FirebaseInstallations (~> 1.2) 257 | - GoogleAppMeasurement (= 6.5.0) 258 | - GoogleUtilities/AppDelegateSwizzler (~> 6.0) 259 | - GoogleUtilities/MethodSwizzler (~> 6.0) 260 | - GoogleUtilities/Network (~> 6.0) 261 | - "GoogleUtilities/NSData+zlib (~> 6.0)" 262 | - nanopb (~> 1.30905.0) 263 | - FirebaseAuth (6.5.3): 264 | - FirebaseAuthInterop (~> 1.0) 265 | - FirebaseCore (~> 6.6) 266 | - GoogleUtilities/AppDelegateSwizzler (~> 6.5) 267 | - GoogleUtilities/Environment (~> 6.5) 268 | - GTMSessionFetcher/Core (~> 1.1) 269 | - FirebaseAuthInterop (1.1.0) 270 | - FirebaseCore (6.7.0): 271 | - FirebaseCoreDiagnostics (~> 1.3) 272 | - FirebaseCoreDiagnosticsInterop (~> 1.2) 273 | - GoogleUtilities/Environment (~> 6.5) 274 | - GoogleUtilities/Logger (~> 6.5) 275 | - FirebaseCoreDiagnostics (1.3.0): 276 | - FirebaseCoreDiagnosticsInterop (~> 1.2) 277 | - GoogleDataTransportCCTSupport (~> 3.1) 278 | - GoogleUtilities/Environment (~> 6.5) 279 | - GoogleUtilities/Logger (~> 6.5) 280 | - nanopb (~> 1.30905.0) 281 | - FirebaseCoreDiagnosticsInterop (1.2.0) 282 | - FirebaseFirestore (1.13.0): 283 | - abseil/algorithm (= 0.20200225.0) 284 | - abseil/base (= 0.20200225.0) 285 | - abseil/memory (= 0.20200225.0) 286 | - abseil/meta (= 0.20200225.0) 287 | - abseil/strings/strings (= 0.20200225.0) 288 | - abseil/time (= 0.20200225.0) 289 | - abseil/types (= 0.20200225.0) 290 | - FirebaseAuthInterop (~> 1.0) 291 | - FirebaseCore (~> 6.2) 292 | - "gRPC-C++ (~> 1.28.0)" 293 | - leveldb-library (~> 1.22) 294 | - nanopb (~> 1.30905.0) 295 | - FirebaseInstallations (1.2.0): 296 | - FirebaseCore (~> 6.6) 297 | - GoogleUtilities/Environment (~> 6.6) 298 | - GoogleUtilities/UserDefaults (~> 6.6) 299 | - PromisesObjC (~> 1.2) 300 | - Flutter (1.0.0) 301 | - google_sign_in (0.0.1): 302 | - Flutter 303 | - GoogleSignIn (~> 5.0) 304 | - google_sign_in_web (0.8.1): 305 | - Flutter 306 | - GoogleAppMeasurement (6.5.0): 307 | - GoogleUtilities/AppDelegateSwizzler (~> 6.0) 308 | - GoogleUtilities/MethodSwizzler (~> 6.0) 309 | - GoogleUtilities/Network (~> 6.0) 310 | - "GoogleUtilities/NSData+zlib (~> 6.0)" 311 | - nanopb (~> 1.30905.0) 312 | - GoogleDataTransport (6.1.0) 313 | - GoogleDataTransportCCTSupport (3.1.0): 314 | - GoogleDataTransport (~> 6.1) 315 | - nanopb (~> 1.30905.0) 316 | - GoogleSignIn (5.0.2): 317 | - AppAuth (~> 1.2) 318 | - GTMAppAuth (~> 1.0) 319 | - GTMSessionFetcher/Core (~> 1.1) 320 | - GoogleUtilities/AppDelegateSwizzler (6.6.0): 321 | - GoogleUtilities/Environment 322 | - GoogleUtilities/Logger 323 | - GoogleUtilities/Network 324 | - GoogleUtilities/Environment (6.6.0): 325 | - PromisesObjC (~> 1.2) 326 | - GoogleUtilities/Logger (6.6.0): 327 | - GoogleUtilities/Environment 328 | - GoogleUtilities/MethodSwizzler (6.6.0): 329 | - GoogleUtilities/Logger 330 | - GoogleUtilities/Network (6.6.0): 331 | - GoogleUtilities/Logger 332 | - "GoogleUtilities/NSData+zlib" 333 | - GoogleUtilities/Reachability 334 | - "GoogleUtilities/NSData+zlib (6.6.0)" 335 | - GoogleUtilities/Reachability (6.6.0): 336 | - GoogleUtilities/Logger 337 | - GoogleUtilities/UserDefaults (6.6.0): 338 | - GoogleUtilities/Logger 339 | - "gRPC-C++ (1.28.0)": 340 | - "gRPC-C++/Implementation (= 1.28.0)" 341 | - "gRPC-C++/Interface (= 1.28.0)" 342 | - "gRPC-C++/Implementation (1.28.0)": 343 | - abseil/container/inlined_vector (= 0.20200225.0) 344 | - abseil/memory/memory (= 0.20200225.0) 345 | - abseil/strings/str_format (= 0.20200225.0) 346 | - abseil/strings/strings (= 0.20200225.0) 347 | - abseil/types/optional (= 0.20200225.0) 348 | - "gRPC-C++/Interface (= 1.28.0)" 349 | - gRPC-Core (= 1.28.0) 350 | - "gRPC-C++/Interface (1.28.0)" 351 | - gRPC-Core (1.28.0): 352 | - gRPC-Core/Implementation (= 1.28.0) 353 | - gRPC-Core/Interface (= 1.28.0) 354 | - gRPC-Core/Implementation (1.28.0): 355 | - abseil/container/inlined_vector (= 0.20200225.0) 356 | - abseil/memory/memory (= 0.20200225.0) 357 | - abseil/strings/str_format (= 0.20200225.0) 358 | - abseil/strings/strings (= 0.20200225.0) 359 | - abseil/types/optional (= 0.20200225.0) 360 | - BoringSSL-GRPC (= 0.0.7) 361 | - gRPC-Core/Interface (= 1.28.0) 362 | - gRPC-Core/Interface (1.28.0) 363 | - GTMAppAuth (1.0.0): 364 | - AppAuth/Core (~> 1.0) 365 | - GTMSessionFetcher (~> 1.1) 366 | - GTMSessionFetcher (1.4.0): 367 | - GTMSessionFetcher/Full (= 1.4.0) 368 | - GTMSessionFetcher/Core (1.4.0) 369 | - GTMSessionFetcher/Full (1.4.0): 370 | - GTMSessionFetcher/Core (= 1.4.0) 371 | - leveldb-library (1.22) 372 | - nanopb (1.30905.0): 373 | - nanopb/decode (= 1.30905.0) 374 | - nanopb/encode (= 1.30905.0) 375 | - nanopb/decode (1.30905.0) 376 | - nanopb/encode (1.30905.0) 377 | - PromisesObjC (1.2.8) 378 | 379 | DEPENDENCIES: 380 | - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) 381 | - cloud_firestore_web (from `.symlinks/plugins/cloud_firestore_web/ios`) 382 | - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) 383 | - firebase_auth_web (from `.symlinks/plugins/firebase_auth_web/ios`) 384 | - firebase_core (from `.symlinks/plugins/firebase_core/ios`) 385 | - firebase_core_web (from `.symlinks/plugins/firebase_core_web/ios`) 386 | - Flutter (from `Flutter`) 387 | - google_sign_in (from `.symlinks/plugins/google_sign_in/ios`) 388 | - google_sign_in_web (from `.symlinks/plugins/google_sign_in_web/ios`) 389 | 390 | SPEC REPOS: 391 | trunk: 392 | - abseil 393 | - AppAuth 394 | - BoringSSL-GRPC 395 | - Firebase 396 | - FirebaseAnalytics 397 | - FirebaseAuth 398 | - FirebaseAuthInterop 399 | - FirebaseCore 400 | - FirebaseCoreDiagnostics 401 | - FirebaseCoreDiagnosticsInterop 402 | - FirebaseFirestore 403 | - FirebaseInstallations 404 | - GoogleAppMeasurement 405 | - GoogleDataTransport 406 | - GoogleDataTransportCCTSupport 407 | - GoogleSignIn 408 | - GoogleUtilities 409 | - "gRPC-C++" 410 | - gRPC-Core 411 | - GTMAppAuth 412 | - GTMSessionFetcher 413 | - leveldb-library 414 | - nanopb 415 | - PromisesObjC 416 | 417 | EXTERNAL SOURCES: 418 | cloud_firestore: 419 | :path: ".symlinks/plugins/cloud_firestore/ios" 420 | cloud_firestore_web: 421 | :path: ".symlinks/plugins/cloud_firestore_web/ios" 422 | firebase_auth: 423 | :path: ".symlinks/plugins/firebase_auth/ios" 424 | firebase_auth_web: 425 | :path: ".symlinks/plugins/firebase_auth_web/ios" 426 | firebase_core: 427 | :path: ".symlinks/plugins/firebase_core/ios" 428 | firebase_core_web: 429 | :path: ".symlinks/plugins/firebase_core_web/ios" 430 | Flutter: 431 | :path: Flutter 432 | google_sign_in: 433 | :path: ".symlinks/plugins/google_sign_in/ios" 434 | google_sign_in_web: 435 | :path: ".symlinks/plugins/google_sign_in_web/ios" 436 | 437 | SPEC CHECKSUMS: 438 | abseil: 6c8eb7892aefa08d929b39f9bb108e5367e3228f 439 | AppAuth: 73574f3013a1e65b9601a3ddc8b3158cce68c09d 440 | BoringSSL-GRPC: 8edf627ee524575e2f8d19d56f068b448eea3879 441 | cloud_firestore: 4cc700e236ebfe2d5d980e49cb066d202cfee0e9 442 | cloud_firestore_web: 9ec3dc7f5f98de5129339802d491c1204462bfec 443 | Firebase: b28e55c60efd98963cd9011fe2fac5a10c2ba124 444 | firebase_auth: af8784c4d8d87c36f730a305f97bfbcb24db024b 445 | firebase_auth_web: 0955c07bcc06e84af76b9d4e32e6f31518f2d7de 446 | firebase_core: 335c02abd48672b7c83c683df833d0488a72e73e 447 | firebase_core_web: d501d8b946b60c8af265428ce483b0fff5ad52d1 448 | FirebaseAnalytics: 7386fc2176e3f93ad8ef34b5b1f2b33a891e4962 449 | FirebaseAuth: 7047aec89c0b17ecd924a550c853f0c27ac6015e 450 | FirebaseAuthInterop: a0f37ae05833af156e72028f648d313f7e7592e9 451 | FirebaseCore: e610482f64097b0e9f056cd97bc6b33dfabcbb6a 452 | FirebaseCoreDiagnostics: 4a773a47bd83bbd5a9b1ccf1ce7caa8b2d535e67 453 | FirebaseCoreDiagnosticsInterop: 296e2c5f5314500a850ad0b83e9e7c10b011a850 454 | FirebaseFirestore: 35f8f67d7b25e4743c62ea6e46c38cafa8dc32b5 455 | FirebaseInstallations: 2119fb3e46b0a88bfdbf12562f855ee3252462fa 456 | Flutter: 0e3d915762c693b495b44d77113d4970485de6ec 457 | google_sign_in: 6bd214b9c154f881422f5fe27b66aaa7bbd580cc 458 | google_sign_in_web: 52deb24929ac0992baff65c57956031c44ed44c3 459 | GoogleAppMeasurement: 4c644d86835d827bab30ab6aabb9ecaf1f500735 460 | GoogleDataTransport: f6f8eba931df03ebd2232ff4645aa85f8f47b5ab 461 | GoogleDataTransportCCTSupport: d70a561f7d236af529fee598835caad5e25f6d3d 462 | GoogleSignIn: 7137d297ddc022a7e0aa4619c86d72c909fa7213 463 | GoogleUtilities: 39530bc0ad980530298e9c4af8549e991fd033b1 464 | "gRPC-C++": 2ea13a2e14f0b89991a0b4b0151e7c6a56319516 465 | gRPC-Core: 325ba201411619a7302c621a1c8ee787719d4b9b 466 | GTMAppAuth: 4deac854479704f348309e7b66189e604cf5e01e 467 | GTMSessionFetcher: 6f5c8abbab8a9bce4bb3f057e317728ec6182b10 468 | leveldb-library: 55d93ee664b4007aac644a782d11da33fba316f7 469 | nanopb: c43f40fadfe79e8b8db116583945847910cbabc9 470 | PromisesObjC: c119f3cd559f50b7ae681fa59dc1acd19173b7e6 471 | 472 | PODFILE CHECKSUM: f32fb4e7c14f8b3ca19a369d7be425dd9241af27 473 | 474 | COCOAPODS: 1.9.1 475 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 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 | 518DBEDE236717D300C9A667 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 518DBEDD236717D300C9A667 /* GoogleService-Info.plist */; }; 13 | 6DCB1D355839D95661E73C25 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3FA8467D06F039FA08D710F1 /* libPods-Runner.a */; }; 14 | 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; 15 | 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; 16 | 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; 17 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 18 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 19 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXCopyFilesBuildPhase section */ 23 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 24 | isa = PBXCopyFilesBuildPhase; 25 | buildActionMask = 2147483647; 26 | dstPath = ""; 27 | dstSubfolderSpec = 10; 28 | files = ( 29 | ); 30 | name = "Embed Frameworks"; 31 | runOnlyForDeploymentPostprocessing = 0; 32 | }; 33 | /* End PBXCopyFilesBuildPhase section */ 34 | 35 | /* Begin PBXFileReference section */ 36 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 37 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 38 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 39 | 3FA8467D06F039FA08D710F1 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 40 | 518DBEDD236717D300C9A667 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 41 | 763539FDF9133803B3EAC97B /* 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 = ""; }; 42 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 43 | 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 44 | 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 45 | 881541BE1F8B78BDEAA73063 /* 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 = ""; }; 46 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 47 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 48 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 50 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 51 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 52 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 53 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54 | B56F7D1505FAD88918476963 /* 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 = ""; }; 55 | /* End PBXFileReference section */ 56 | 57 | /* Begin PBXFrameworksBuildPhase section */ 58 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 59 | isa = PBXFrameworksBuildPhase; 60 | buildActionMask = 2147483647; 61 | files = ( 62 | 6DCB1D355839D95661E73C25 /* libPods-Runner.a in Frameworks */, 63 | ); 64 | runOnlyForDeploymentPostprocessing = 0; 65 | }; 66 | /* End PBXFrameworksBuildPhase section */ 67 | 68 | /* Begin PBXGroup section */ 69 | 72159BD3FA549282EBC49D65 /* Pods */ = { 70 | isa = PBXGroup; 71 | children = ( 72 | 881541BE1F8B78BDEAA73063 /* Pods-Runner.debug.xcconfig */, 73 | 763539FDF9133803B3EAC97B /* Pods-Runner.release.xcconfig */, 74 | B56F7D1505FAD88918476963 /* Pods-Runner.profile.xcconfig */, 75 | ); 76 | path = Pods; 77 | sourceTree = ""; 78 | }; 79 | 9740EEB11CF90186004384FC /* Flutter */ = { 80 | isa = PBXGroup; 81 | children = ( 82 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 83 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 84 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 85 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 86 | ); 87 | name = Flutter; 88 | sourceTree = ""; 89 | }; 90 | 97C146E51CF9000F007C117D = { 91 | isa = PBXGroup; 92 | children = ( 93 | 9740EEB11CF90186004384FC /* Flutter */, 94 | 97C146F01CF9000F007C117D /* Runner */, 95 | 97C146EF1CF9000F007C117D /* Products */, 96 | 72159BD3FA549282EBC49D65 /* Pods */, 97 | CD9DCCDA280796EF1A133DCE /* Frameworks */, 98 | ); 99 | sourceTree = ""; 100 | }; 101 | 97C146EF1CF9000F007C117D /* Products */ = { 102 | isa = PBXGroup; 103 | children = ( 104 | 97C146EE1CF9000F007C117D /* Runner.app */, 105 | ); 106 | name = Products; 107 | sourceTree = ""; 108 | }; 109 | 97C146F01CF9000F007C117D /* Runner */ = { 110 | isa = PBXGroup; 111 | children = ( 112 | 518DBEDD236717D300C9A667 /* GoogleService-Info.plist */, 113 | 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, 114 | 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, 115 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 116 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 117 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 118 | 97C147021CF9000F007C117D /* Info.plist */, 119 | 97C146F11CF9000F007C117D /* Supporting Files */, 120 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 121 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 122 | ); 123 | path = Runner; 124 | sourceTree = ""; 125 | }; 126 | 97C146F11CF9000F007C117D /* Supporting Files */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | 97C146F21CF9000F007C117D /* main.m */, 130 | ); 131 | name = "Supporting Files"; 132 | sourceTree = ""; 133 | }; 134 | CD9DCCDA280796EF1A133DCE /* Frameworks */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | 3FA8467D06F039FA08D710F1 /* libPods-Runner.a */, 138 | ); 139 | name = Frameworks; 140 | sourceTree = ""; 141 | }; 142 | /* End PBXGroup section */ 143 | 144 | /* Begin PBXNativeTarget section */ 145 | 97C146ED1CF9000F007C117D /* Runner */ = { 146 | isa = PBXNativeTarget; 147 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 148 | buildPhases = ( 149 | 78893C5A043ED32F5E50DBB6 /* [CP] Check Pods Manifest.lock */, 150 | 9740EEB61CF901F6004384FC /* Run Script */, 151 | 97C146EA1CF9000F007C117D /* Sources */, 152 | 97C146EB1CF9000F007C117D /* Frameworks */, 153 | 97C146EC1CF9000F007C117D /* Resources */, 154 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 155 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 156 | 8BF65C1E4D1600906A89F1E4 /* [CP] Embed Pods Frameworks */, 157 | 31622E0781C8F8655B4A4E27 /* [CP] Copy Pods Resources */, 158 | ); 159 | buildRules = ( 160 | ); 161 | dependencies = ( 162 | ); 163 | name = Runner; 164 | productName = Runner; 165 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 166 | productType = "com.apple.product-type.application"; 167 | }; 168 | /* End PBXNativeTarget section */ 169 | 170 | /* Begin PBXProject section */ 171 | 97C146E61CF9000F007C117D /* Project object */ = { 172 | isa = PBXProject; 173 | attributes = { 174 | LastUpgradeCheck = 1020; 175 | ORGANIZATIONNAME = "The Chromium Authors"; 176 | TargetAttributes = { 177 | 97C146ED1CF9000F007C117D = { 178 | CreatedOnToolsVersion = 7.3.1; 179 | }; 180 | }; 181 | }; 182 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 183 | compatibilityVersion = "Xcode 3.2"; 184 | developmentRegion = en; 185 | hasScannedForEncodings = 0; 186 | knownRegions = ( 187 | en, 188 | Base, 189 | ); 190 | mainGroup = 97C146E51CF9000F007C117D; 191 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 192 | projectDirPath = ""; 193 | projectRoot = ""; 194 | targets = ( 195 | 97C146ED1CF9000F007C117D /* Runner */, 196 | ); 197 | }; 198 | /* End PBXProject section */ 199 | 200 | /* Begin PBXResourcesBuildPhase section */ 201 | 97C146EC1CF9000F007C117D /* Resources */ = { 202 | isa = PBXResourcesBuildPhase; 203 | buildActionMask = 2147483647; 204 | files = ( 205 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 206 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 207 | 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 208 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 209 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 210 | 518DBEDE236717D300C9A667 /* GoogleService-Info.plist in Resources */, 211 | ); 212 | runOnlyForDeploymentPostprocessing = 0; 213 | }; 214 | /* End PBXResourcesBuildPhase section */ 215 | 216 | /* Begin PBXShellScriptBuildPhase section */ 217 | 31622E0781C8F8655B4A4E27 /* [CP] Copy Pods Resources */ = { 218 | isa = PBXShellScriptBuildPhase; 219 | buildActionMask = 2147483647; 220 | files = ( 221 | ); 222 | inputPaths = ( 223 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", 224 | "${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle", 225 | "${PODS_CONFIGURATION_BUILD_DIR}/gRPC-C++/gRPCCertificates-Cpp.bundle", 226 | ); 227 | name = "[CP] Copy Pods Resources"; 228 | outputPaths = ( 229 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/GoogleSignIn.bundle", 230 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates-Cpp.bundle", 231 | ); 232 | runOnlyForDeploymentPostprocessing = 0; 233 | shellPath = /bin/sh; 234 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; 235 | showEnvVarsInLog = 0; 236 | }; 237 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 238 | isa = PBXShellScriptBuildPhase; 239 | buildActionMask = 2147483647; 240 | files = ( 241 | ); 242 | inputPaths = ( 243 | ); 244 | name = "Thin Binary"; 245 | outputPaths = ( 246 | ); 247 | runOnlyForDeploymentPostprocessing = 0; 248 | shellPath = /bin/sh; 249 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 250 | }; 251 | 78893C5A043ED32F5E50DBB6 /* [CP] Check Pods Manifest.lock */ = { 252 | isa = PBXShellScriptBuildPhase; 253 | buildActionMask = 2147483647; 254 | files = ( 255 | ); 256 | inputFileListPaths = ( 257 | ); 258 | inputPaths = ( 259 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 260 | "${PODS_ROOT}/Manifest.lock", 261 | ); 262 | name = "[CP] Check Pods Manifest.lock"; 263 | outputFileListPaths = ( 264 | ); 265 | outputPaths = ( 266 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 267 | ); 268 | runOnlyForDeploymentPostprocessing = 0; 269 | shellPath = /bin/sh; 270 | 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"; 271 | showEnvVarsInLog = 0; 272 | }; 273 | 8BF65C1E4D1600906A89F1E4 /* [CP] Embed Pods Frameworks */ = { 274 | isa = PBXShellScriptBuildPhase; 275 | buildActionMask = 2147483647; 276 | files = ( 277 | ); 278 | inputPaths = ( 279 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", 280 | "${PODS_ROOT}/../Flutter/Flutter.framework", 281 | ); 282 | name = "[CP] Embed Pods Frameworks"; 283 | outputPaths = ( 284 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", 285 | ); 286 | runOnlyForDeploymentPostprocessing = 0; 287 | shellPath = /bin/sh; 288 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; 289 | showEnvVarsInLog = 0; 290 | }; 291 | 9740EEB61CF901F6004384FC /* Run Script */ = { 292 | isa = PBXShellScriptBuildPhase; 293 | buildActionMask = 2147483647; 294 | files = ( 295 | ); 296 | inputPaths = ( 297 | ); 298 | name = "Run Script"; 299 | outputPaths = ( 300 | ); 301 | runOnlyForDeploymentPostprocessing = 0; 302 | shellPath = /bin/sh; 303 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 304 | }; 305 | /* End PBXShellScriptBuildPhase section */ 306 | 307 | /* Begin PBXSourcesBuildPhase section */ 308 | 97C146EA1CF9000F007C117D /* Sources */ = { 309 | isa = PBXSourcesBuildPhase; 310 | buildActionMask = 2147483647; 311 | files = ( 312 | 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, 313 | 97C146F31CF9000F007C117D /* main.m in Sources */, 314 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 315 | ); 316 | runOnlyForDeploymentPostprocessing = 0; 317 | }; 318 | /* End PBXSourcesBuildPhase section */ 319 | 320 | /* Begin PBXVariantGroup section */ 321 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 322 | isa = PBXVariantGroup; 323 | children = ( 324 | 97C146FB1CF9000F007C117D /* Base */, 325 | ); 326 | name = Main.storyboard; 327 | sourceTree = ""; 328 | }; 329 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 330 | isa = PBXVariantGroup; 331 | children = ( 332 | 97C147001CF9000F007C117D /* Base */, 333 | ); 334 | name = LaunchScreen.storyboard; 335 | sourceTree = ""; 336 | }; 337 | /* End PBXVariantGroup section */ 338 | 339 | /* Begin XCBuildConfiguration section */ 340 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 341 | isa = XCBuildConfiguration; 342 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 343 | buildSettings = { 344 | ALWAYS_SEARCH_USER_PATHS = NO; 345 | CLANG_ANALYZER_NONNULL = YES; 346 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 347 | CLANG_CXX_LIBRARY = "libc++"; 348 | CLANG_ENABLE_MODULES = YES; 349 | CLANG_ENABLE_OBJC_ARC = YES; 350 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 351 | CLANG_WARN_BOOL_CONVERSION = YES; 352 | CLANG_WARN_COMMA = YES; 353 | CLANG_WARN_CONSTANT_CONVERSION = YES; 354 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 355 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 356 | CLANG_WARN_EMPTY_BODY = YES; 357 | CLANG_WARN_ENUM_CONVERSION = YES; 358 | CLANG_WARN_INFINITE_RECURSION = YES; 359 | CLANG_WARN_INT_CONVERSION = YES; 360 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 361 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 362 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 363 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 364 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 365 | CLANG_WARN_STRICT_PROTOTYPES = YES; 366 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 367 | CLANG_WARN_UNREACHABLE_CODE = YES; 368 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 369 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 370 | COPY_PHASE_STRIP = NO; 371 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 372 | ENABLE_NS_ASSERTIONS = NO; 373 | ENABLE_STRICT_OBJC_MSGSEND = YES; 374 | GCC_C_LANGUAGE_STANDARD = gnu99; 375 | GCC_NO_COMMON_BLOCKS = YES; 376 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 377 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 378 | GCC_WARN_UNDECLARED_SELECTOR = YES; 379 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 380 | GCC_WARN_UNUSED_FUNCTION = YES; 381 | GCC_WARN_UNUSED_VARIABLE = YES; 382 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 383 | MTL_ENABLE_DEBUG_INFO = NO; 384 | SDKROOT = iphoneos; 385 | TARGETED_DEVICE_FAMILY = "1,2"; 386 | VALIDATE_PRODUCT = YES; 387 | }; 388 | name = Profile; 389 | }; 390 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 391 | isa = XCBuildConfiguration; 392 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 393 | buildSettings = { 394 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 395 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 396 | DEVELOPMENT_TEAM = S8QB4VV633; 397 | ENABLE_BITCODE = NO; 398 | FRAMEWORK_SEARCH_PATHS = ( 399 | "$(inherited)", 400 | "$(PROJECT_DIR)/Flutter", 401 | ); 402 | INFOPLIST_FILE = Runner/Info.plist; 403 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 404 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 405 | LIBRARY_SEARCH_PATHS = ( 406 | "$(inherited)", 407 | "$(PROJECT_DIR)/Flutter", 408 | ); 409 | PRODUCT_BUNDLE_IDENTIFIER = "net.ithinkdiff.vote-prep"; 410 | PRODUCT_NAME = "$(TARGET_NAME)"; 411 | VERSIONING_SYSTEM = "apple-generic"; 412 | }; 413 | name = Profile; 414 | }; 415 | 97C147031CF9000F007C117D /* Debug */ = { 416 | isa = XCBuildConfiguration; 417 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 418 | buildSettings = { 419 | ALWAYS_SEARCH_USER_PATHS = NO; 420 | CLANG_ANALYZER_NONNULL = YES; 421 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 422 | CLANG_CXX_LIBRARY = "libc++"; 423 | CLANG_ENABLE_MODULES = YES; 424 | CLANG_ENABLE_OBJC_ARC = YES; 425 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 426 | CLANG_WARN_BOOL_CONVERSION = YES; 427 | CLANG_WARN_COMMA = YES; 428 | CLANG_WARN_CONSTANT_CONVERSION = YES; 429 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 430 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 431 | CLANG_WARN_EMPTY_BODY = YES; 432 | CLANG_WARN_ENUM_CONVERSION = YES; 433 | CLANG_WARN_INFINITE_RECURSION = YES; 434 | CLANG_WARN_INT_CONVERSION = YES; 435 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 436 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 437 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 438 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 439 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 440 | CLANG_WARN_STRICT_PROTOTYPES = YES; 441 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 442 | CLANG_WARN_UNREACHABLE_CODE = YES; 443 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 444 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 445 | COPY_PHASE_STRIP = NO; 446 | DEBUG_INFORMATION_FORMAT = dwarf; 447 | ENABLE_STRICT_OBJC_MSGSEND = YES; 448 | ENABLE_TESTABILITY = YES; 449 | GCC_C_LANGUAGE_STANDARD = gnu99; 450 | GCC_DYNAMIC_NO_PIC = NO; 451 | GCC_NO_COMMON_BLOCKS = YES; 452 | GCC_OPTIMIZATION_LEVEL = 0; 453 | GCC_PREPROCESSOR_DEFINITIONS = ( 454 | "DEBUG=1", 455 | "$(inherited)", 456 | ); 457 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 458 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 459 | GCC_WARN_UNDECLARED_SELECTOR = YES; 460 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 461 | GCC_WARN_UNUSED_FUNCTION = YES; 462 | GCC_WARN_UNUSED_VARIABLE = YES; 463 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 464 | MTL_ENABLE_DEBUG_INFO = YES; 465 | ONLY_ACTIVE_ARCH = YES; 466 | SDKROOT = iphoneos; 467 | TARGETED_DEVICE_FAMILY = "1,2"; 468 | }; 469 | name = Debug; 470 | }; 471 | 97C147041CF9000F007C117D /* Release */ = { 472 | isa = XCBuildConfiguration; 473 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 474 | buildSettings = { 475 | ALWAYS_SEARCH_USER_PATHS = NO; 476 | CLANG_ANALYZER_NONNULL = YES; 477 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 478 | CLANG_CXX_LIBRARY = "libc++"; 479 | CLANG_ENABLE_MODULES = YES; 480 | CLANG_ENABLE_OBJC_ARC = YES; 481 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 482 | CLANG_WARN_BOOL_CONVERSION = YES; 483 | CLANG_WARN_COMMA = YES; 484 | CLANG_WARN_CONSTANT_CONVERSION = YES; 485 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 486 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 487 | CLANG_WARN_EMPTY_BODY = YES; 488 | CLANG_WARN_ENUM_CONVERSION = YES; 489 | CLANG_WARN_INFINITE_RECURSION = YES; 490 | CLANG_WARN_INT_CONVERSION = YES; 491 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 492 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 493 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 494 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 495 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 496 | CLANG_WARN_STRICT_PROTOTYPES = YES; 497 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 498 | CLANG_WARN_UNREACHABLE_CODE = YES; 499 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 500 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 501 | COPY_PHASE_STRIP = NO; 502 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 503 | ENABLE_NS_ASSERTIONS = NO; 504 | ENABLE_STRICT_OBJC_MSGSEND = YES; 505 | GCC_C_LANGUAGE_STANDARD = gnu99; 506 | GCC_NO_COMMON_BLOCKS = YES; 507 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 508 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 509 | GCC_WARN_UNDECLARED_SELECTOR = YES; 510 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 511 | GCC_WARN_UNUSED_FUNCTION = YES; 512 | GCC_WARN_UNUSED_VARIABLE = YES; 513 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 514 | MTL_ENABLE_DEBUG_INFO = NO; 515 | SDKROOT = iphoneos; 516 | TARGETED_DEVICE_FAMILY = "1,2"; 517 | VALIDATE_PRODUCT = YES; 518 | }; 519 | name = Release; 520 | }; 521 | 97C147061CF9000F007C117D /* Debug */ = { 522 | isa = XCBuildConfiguration; 523 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 524 | buildSettings = { 525 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 526 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 527 | ENABLE_BITCODE = NO; 528 | FRAMEWORK_SEARCH_PATHS = ( 529 | "$(inherited)", 530 | "$(PROJECT_DIR)/Flutter", 531 | ); 532 | INFOPLIST_FILE = Runner/Info.plist; 533 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 534 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 535 | LIBRARY_SEARCH_PATHS = ( 536 | "$(inherited)", 537 | "$(PROJECT_DIR)/Flutter", 538 | ); 539 | PRODUCT_BUNDLE_IDENTIFIER = "net.ithinkdiff.vote-prep"; 540 | PRODUCT_NAME = "$(TARGET_NAME)"; 541 | VERSIONING_SYSTEM = "apple-generic"; 542 | }; 543 | name = Debug; 544 | }; 545 | 97C147071CF9000F007C117D /* Release */ = { 546 | isa = XCBuildConfiguration; 547 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 548 | buildSettings = { 549 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 550 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 551 | ENABLE_BITCODE = NO; 552 | FRAMEWORK_SEARCH_PATHS = ( 553 | "$(inherited)", 554 | "$(PROJECT_DIR)/Flutter", 555 | ); 556 | INFOPLIST_FILE = Runner/Info.plist; 557 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 558 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 559 | LIBRARY_SEARCH_PATHS = ( 560 | "$(inherited)", 561 | "$(PROJECT_DIR)/Flutter", 562 | ); 563 | PRODUCT_BUNDLE_IDENTIFIER = "net.ithinkdiff.vote-prep"; 564 | PRODUCT_NAME = "$(TARGET_NAME)"; 565 | VERSIONING_SYSTEM = "apple-generic"; 566 | }; 567 | name = Release; 568 | }; 569 | /* End XCBuildConfiguration section */ 570 | 571 | /* Begin XCConfigurationList section */ 572 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 573 | isa = XCConfigurationList; 574 | buildConfigurations = ( 575 | 97C147031CF9000F007C117D /* Debug */, 576 | 97C147041CF9000F007C117D /* Release */, 577 | 249021D3217E4FDB00AE95B9 /* Profile */, 578 | ); 579 | defaultConfigurationIsVisible = 0; 580 | defaultConfigurationName = Release; 581 | }; 582 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 583 | isa = XCConfigurationList; 584 | buildConfigurations = ( 585 | 97C147061CF9000F007C117D /* Debug */, 586 | 97C147071CF9000F007C117D /* Release */, 587 | 249021D4217E4FDB00AE95B9 /* Profile */, 588 | ); 589 | defaultConfigurationIsVisible = 0; 590 | defaultConfigurationName = Release; 591 | }; 592 | /* End XCConfigurationList section */ 593 | }; 594 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 595 | } 596 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface AppDelegate : FlutterAppDelegate 5 | 6 | @end 7 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.m: -------------------------------------------------------------------------------- 1 | #include "AppDelegate.h" 2 | #include "GeneratedPluginRegistrant.h" 3 | 4 | @implementation AppDelegate 5 | 6 | - (BOOL)application:(UIApplication *)application 7 | didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 8 | [GeneratedPluginRegistrant registerWithRegistry:self]; 9 | // Override point for customization after application launch. 10 | return [super application:application didFinishLaunchingWithOptions:launchOptions]; 11 | } 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/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/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/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/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/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/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/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/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/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/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/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/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/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/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/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/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/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/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/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/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/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/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/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/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mahmudahsan/flutter_firebase_vote/d430a949f32d6d9c27a62e7b247b3a02bbe4e716/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /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. -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /ios/Runner/GoogleService-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CLIENT_ID 6 | 694052778285-lfdh5fnfdjl6p9n5h6f7av7ttl467nrp.apps.googleusercontent.com 7 | REVERSED_CLIENT_ID 8 | com.googleusercontent.apps.694052778285-lfdh5fnfdjl6p9n5h6f7av7ttl467nrp 9 | API_KEY 10 | AIzaSyCM_rF2O3xdUKpnwjwP1kzhpGg_vIYESp0 11 | GCM_SENDER_ID 12 | 694052778285 13 | PLIST_VERSION 14 | 1 15 | BUNDLE_ID 16 | net.ithinkdiff.vote-prep 17 | PROJECT_ID 18 | vote-prep 19 | STORAGE_BUCKET 20 | vote-prep.appspot.com 21 | IS_ADS_ENABLED 22 | 23 | IS_ANALYTICS_ENABLED 24 | 25 | IS_APPINVITE_ENABLED 26 | 27 | IS_GCM_ENABLED 28 | 29 | IS_SIGNIN_ENABLED 30 | 31 | GOOGLE_APP_ID 32 | 1:694052778285:ios:ade67d268c6f1c8f6923a4 33 | DATABASE_URL 34 | https://vote-prep.firebaseio.com 35 | 36 | -------------------------------------------------------------------------------- /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 | flutter_firebase_vote 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleURLTypes 22 | 23 | 24 | CFBundleTypeRole 25 | Editor 26 | CFBundleURLSchemes 27 | 28 | com.googleusercontent.apps.694052778285-lfdh5fnfdjl6p9n5h6f7av7ttl467nrp 29 | 30 | 31 | 32 | CFBundleVersion 33 | $(FLUTTER_BUILD_NUMBER) 34 | LSRequiresIPhoneOS 35 | 36 | UILaunchStoryboardName 37 | LaunchScreen 38 | UIMainStoryboardFile 39 | Main 40 | UISupportedInterfaceOrientations 41 | 42 | UIInterfaceOrientationPortrait 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | UISupportedInterfaceOrientations~ipad 47 | 48 | UIInterfaceOrientationPortrait 49 | UIInterfaceOrientationPortraitUpsideDown 50 | UIInterfaceOrientationLandscapeLeft 51 | UIInterfaceOrientationLandscapeRight 52 | 53 | UIViewControllerBasedStatusBarAppearance 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /ios/Runner/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "AppDelegate.h" 4 | 5 | int main(int argc, char* argv[]) { 6 | @autoreleasepool { 7 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/constants.dart: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Mahmud Ahsan 3 | * https://github.com/mahmudahsan 4 | */ 5 | 6 | const kAppName = 'Vote App'; 7 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_firebase_vote/screens/result_screen.dart'; 3 | import 'package:provider/provider.dart'; 4 | import 'screens/launch_screen.dart'; 5 | import 'screens/home_screen.dart'; 6 | import 'constants.dart'; 7 | import 'package:flutter_firebase_vote/state/vote.dart'; 8 | import 'package:flutter_firebase_vote/state/authentication.dart'; 9 | import 'package:flutter_firebase_vote/utilities.dart'; 10 | 11 | void main() => runApp(VoteApp()); 12 | 13 | class VoteApp extends StatelessWidget { 14 | @override 15 | Widget build(BuildContext context) { 16 | return MultiProvider( 17 | providers: [ 18 | ChangeNotifierProvider(create: (_) => VoteState()), 19 | ChangeNotifierProvider(create: (_) => AuthenticationState()), 20 | ], 21 | child: 22 | Consumer(builder: (context, authState, child) { 23 | return MaterialApp( 24 | initialRoute: '/', 25 | routes: { 26 | '/': (context) => Scaffold( 27 | body: LaunchScreen(), 28 | ), 29 | '/home': (context) => Scaffold( 30 | appBar: AppBar( 31 | title: Text(kAppName), 32 | actions: [ 33 | getActions(context, authState), 34 | ], 35 | ), 36 | body: HomeScreeen(), 37 | ), 38 | '/result': (context) => Scaffold( 39 | appBar: AppBar( 40 | title: Text('Result'), 41 | leading: IconButton( 42 | icon: Icon(Icons.home), 43 | color: Colors.white, 44 | onPressed: () { 45 | Navigator.pushReplacementNamed(context, '/home'); 46 | }, 47 | ), 48 | actions: [ 49 | getActions(context, authState), 50 | ], 51 | ), 52 | body: ResultScreen(), 53 | ) 54 | }, 55 | ); 56 | })); 57 | } 58 | 59 | PopupMenuButton getActions( 60 | BuildContext context, AuthenticationState authState) { 61 | return PopupMenuButton( 62 | itemBuilder: (context) => [ 63 | PopupMenuItem( 64 | value: 1, 65 | child: Text('Logout'), 66 | ) 67 | ], 68 | onSelected: (value) { 69 | if (value == 1) { 70 | // logout 71 | authState.logout(); 72 | gotoLoginScreen(context, authState); 73 | } 74 | }, 75 | ); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /lib/models/vote.dart: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Mahmud Ahsan 3 | * https://github.com/mahmudahsan 4 | */ 5 | 6 | class Vote { 7 | String voteId; 8 | String voteTitle; 9 | List> options; 10 | 11 | Vote({this.voteId, this.voteTitle, this.options}); 12 | } 13 | 14 | class Voter { 15 | String uid; 16 | String voteId; 17 | int markedVoteOption; 18 | } 19 | -------------------------------------------------------------------------------- /lib/screens/home_screen.dart: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Mahmud Ahsan 3 | * https://github.com/mahmudahsan 4 | */ 5 | import "package:flutter/material.dart"; 6 | import 'package:flutter_firebase_vote/services/services.dart'; 7 | import 'package:flutter_firebase_vote/state/vote.dart'; 8 | import "package:provider/provider.dart"; 9 | import 'package:loading/loading.dart'; 10 | import 'package:loading/indicator/ball_pulse_indicator.dart'; 11 | 12 | import "../widgets/vote_list.dart"; 13 | import "../widgets/vote.dart"; 14 | import "../state/vote.dart"; 15 | 16 | class HomeScreeen extends StatefulWidget { 17 | @override 18 | _HomeScreeenState createState() => _HomeScreeenState(); 19 | } 20 | 21 | class _HomeScreeenState extends State { 22 | int _currentStep = 0; 23 | 24 | @override 25 | void initState() { 26 | super.initState(); 27 | // loading votes 28 | Future.microtask(() { 29 | Provider.of(context, listen: false).clearState(); 30 | Provider.of(context, listen: false).loadVoteList(context); 31 | }); 32 | } 33 | 34 | @override 35 | Widget build(BuildContext context) { 36 | return Container( 37 | child: Center( 38 | child: Padding( 39 | padding: const EdgeInsets.all(8.0), 40 | child: Consumer(builder: (builder, voteState, child) { 41 | return Container( 42 | child: Column( 43 | children: [ 44 | if (voteState.voteList == null) 45 | Container( 46 | color: Colors.lightBlue, 47 | child: Center( 48 | child: Loading( 49 | indicator: BallPulseIndicator(), size: 100.0), 50 | ), 51 | ), 52 | if (voteState.voteList != null) 53 | Expanded( 54 | child: Stepper( 55 | type: StepperType.horizontal, 56 | currentStep: _currentStep, 57 | steps: [ 58 | getStep( 59 | title: 'Choose', 60 | child: VoteListWidget(), 61 | isActive: true, 62 | ), 63 | getStep( 64 | title: 'Vote', 65 | child: VoteWidget(), 66 | isActive: _currentStep >= 1 ? true : false, 67 | ), 68 | ], 69 | onStepCancel: () { 70 | if (_currentStep <= 0) { 71 | voteState.activeVote = null; 72 | } else if (_currentStep <= 1) { 73 | voteState.selectedOptionInActiveVote = null; 74 | } 75 | 76 | setState(() { 77 | _currentStep = 78 | (_currentStep - 1) < 0 ? 0 : _currentStep - 1; 79 | }); 80 | }, 81 | onStepContinue: () { 82 | if (_currentStep == 0) { 83 | if (step2Required(voteState)) { 84 | setState(() { 85 | _currentStep = (_currentStep + 1) > 2 86 | ? 2 87 | : _currentStep + 1; 88 | }); 89 | } else { 90 | showSnackBar( 91 | context, 'Please select a vote first!'); 92 | } 93 | } else if (_currentStep == 1) { 94 | if (step3Required(voteState)) { 95 | // submit vote 96 | markMyVote(voteState); 97 | 98 | // Go To Result Screen 99 | Navigator.pushReplacementNamed( 100 | context, '/result'); 101 | } else { 102 | showSnackBar(context, 'Please mark your vote!'); 103 | } 104 | } 105 | }, 106 | ), 107 | ), 108 | ], 109 | ), 110 | ); 111 | })), 112 | ), 113 | ); 114 | } 115 | 116 | bool step2Required(VoteState voteState) { 117 | if (voteState.activeVote == null) { 118 | return false; 119 | } 120 | 121 | return true; 122 | } 123 | 124 | bool step3Required(VoteState voteState) { 125 | if (voteState.selectedOptionInActiveVote == null) { 126 | return false; 127 | } 128 | return true; 129 | } 130 | 131 | void showSnackBar(BuildContext context, String msg) { 132 | Scaffold.of(context).showSnackBar(SnackBar( 133 | content: Text( 134 | msg, 135 | style: TextStyle(fontSize: 22), 136 | ), 137 | )); 138 | } 139 | 140 | Step getStep({ 141 | String title, 142 | Widget child, 143 | bool isActive = false, 144 | }) { 145 | return Step( 146 | title: Text(title), 147 | content: child, 148 | isActive: isActive, 149 | ); 150 | } 151 | 152 | void markMyVote(VoteState voteState) { 153 | final voteId = voteState.activeVote.voteId; 154 | final option = voteState.selectedOptionInActiveVote; 155 | 156 | markVote(voteId, option); 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /lib/screens/launch_screen.dart: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Mahmud Ahsan 3 | * https://github.com/mahmudahsan 4 | */ 5 | import 'package:flutter/material.dart'; 6 | import 'package:flutter_firebase_vote/widgets/shared_widgets.dart'; 7 | import 'package:flutter_firebase_vote/constants.dart'; 8 | import 'package:provider/provider.dart'; 9 | import 'package:flutter_firebase_vote/state/authentication.dart'; 10 | import 'package:flutter_firebase_vote/utilities.dart'; 11 | 12 | class LaunchScreen extends StatelessWidget { 13 | @override 14 | Widget build(BuildContext context) { 15 | return Consumer( 16 | builder: (builder, authState, child) { 17 | print(authState.authStatus); 18 | gotoHomeScreen(context, authState); 19 | return Container( 20 | width: 400, 21 | margin: EdgeInsets.all(20.0), 22 | child: Column( 23 | crossAxisAlignment: CrossAxisAlignment.center, 24 | children: [ 25 | Container( 26 | margin: EdgeInsets.only(top: 100), 27 | child: Text( 28 | kAppName, 29 | style: TextStyle( 30 | fontSize: 40.0, 31 | fontWeight: FontWeight.bold, 32 | color: Colors.blueAccent, 33 | ), 34 | ), 35 | ), 36 | SizedBox( 37 | height: 200.0, 38 | ), 39 | if (authState.authStatus == kAuthLoading) 40 | Text( 41 | 'loading...', 42 | style: TextStyle(fontSize: 12.0), 43 | ), 44 | if (authState.authStatus == null || 45 | authState.authStatus == kAuthError) 46 | Container( 47 | child: Column( 48 | children: [ 49 | LoginButton( 50 | label: 'Google Sign In', 51 | onPressed: () => 52 | signIn(context, kAuthSignInGoogle, authState), 53 | ), 54 | SizedBox( 55 | height: 10, 56 | ), 57 | LoginButton( 58 | label: 'Anonymous Sign In', 59 | onPressed: () => 60 | signIn(context, kAuthSignInAnonymous, authState), 61 | ), 62 | ], 63 | ), 64 | ), 65 | if (authState.authStatus == kAuthError) 66 | Text( 67 | 'Error...', 68 | style: TextStyle(fontSize: 12.0, color: Colors.redAccent), 69 | ), 70 | ], 71 | ), 72 | ); 73 | }, 74 | ); 75 | } 76 | 77 | void signIn(context, String service, AuthenticationState authState) { 78 | //Navigator.pushReplacementNamed(context, '/home'); 79 | authState.login(serviceName: service); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /lib/screens/result_screen.dart: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Mahmud Ahsan 3 | * https://github.com/mahmudahsan 4 | */ 5 | import 'package:flutter/material.dart'; 6 | import 'package:flutter_firebase_vote/services/services.dart'; 7 | import 'package:provider/provider.dart'; 8 | import 'package:charts_flutter/flutter.dart' as charts; 9 | import 'package:flutter_firebase_vote/state/vote.dart'; 10 | import 'package:flutter_firebase_vote/models/vote.dart'; 11 | 12 | class ResultScreen extends StatelessWidget { 13 | @override 14 | Widget build(BuildContext context) { 15 | retrieveActiveVoteData(context); 16 | 17 | return Container( 18 | padding: EdgeInsets.all(20), 19 | width: MediaQuery.of(context).size.width, 20 | height: MediaQuery.of(context).size.height / 2, 21 | child: createChart(context), 22 | ); 23 | } 24 | 25 | Widget createChart(BuildContext context) { 26 | return Consumer( 27 | builder: (context, voteState, child) { 28 | return charts.BarChart( 29 | retrieveVoteResult(context, voteState), 30 | animate: true, 31 | ); 32 | }, 33 | ); 34 | } 35 | 36 | List> retrieveVoteResult( 37 | BuildContext context, VoteState voteState) { 38 | Vote activeVote = voteState.activeVote; 39 | 40 | List data = List(); 41 | for (var option in activeVote.options) { 42 | option.forEach((key, value) { 43 | data.add(VoteData(key, value)); 44 | }); 45 | } 46 | 47 | return [ 48 | charts.Series( 49 | id: 'VoteResult', 50 | colorFn: (_, pos) { 51 | if (pos % 2 == 0) { 52 | return charts.MaterialPalette.green.shadeDefault; 53 | } 54 | return charts.MaterialPalette.blue.shadeDefault; 55 | }, 56 | domainFn: (VoteData vote, _) => vote.option, 57 | measureFn: (VoteData vote, _) => vote.total, 58 | data: data, 59 | ) 60 | ]; 61 | } 62 | 63 | void retrieveActiveVoteData(BuildContext context) { 64 | final voteId = 65 | Provider.of(context, listen: false).activeVote?.voteId; 66 | retrieveMarkedVoteFromFirestore(voteId: voteId, context: context); 67 | } 68 | } 69 | 70 | /// Sample ordinal data type. 71 | class VoteData { 72 | final String option; 73 | final int total; 74 | 75 | VoteData(this.option, this.total); 76 | } 77 | -------------------------------------------------------------------------------- /lib/services/authentication.dart: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Mahmud Ahsan 3 | * https://github.com/mahmudahsan 4 | */ 5 | import 'package:flutter/material.dart'; 6 | import 'package:firebase_auth/firebase_auth.dart'; 7 | import 'package:google_sign_in/google_sign_in.dart'; 8 | import 'constants.dart'; 9 | 10 | final FirebaseAuth _auth = FirebaseAuth.instance; 11 | final GoogleSignIn _googleSignIn = GoogleSignIn(); 12 | 13 | Map exposeUser({@required kUsername, @required kUID}) { 14 | return { 15 | kUsername: kUsername, 16 | kUID: kUID, 17 | }; 18 | } 19 | 20 | Future> getCurrentUser() async { 21 | final FirebaseUser user = await _auth.currentUser(); 22 | if (user != null) { 23 | return exposeUser(kUsername: user.displayName, kUID: user.uid); 24 | } 25 | return null; 26 | } 27 | 28 | Future isUserSignedIn() async { 29 | final FirebaseUser currentUser = await _auth.currentUser(); 30 | return currentUser != null; 31 | } 32 | 33 | void signOut() { 34 | try { 35 | _auth.signOut(); 36 | } catch (error) { 37 | print(error); 38 | } 39 | } 40 | 41 | void onAuthenticationChange(Function isLogin) { 42 | _auth.onAuthStateChanged.listen((FirebaseUser user) { 43 | if (user != null) { 44 | isLogin(exposeUser(kUsername: user.displayName, kUID: user.uid)); 45 | } else { 46 | isLogin(null); 47 | } 48 | }); 49 | } 50 | 51 | Future> signInWithGoogle() async { 52 | final GoogleSignInAccount googleUser = await _googleSignIn.signIn(); 53 | final GoogleSignInAuthentication googleAuth = await googleUser.authentication; 54 | 55 | final AuthCredential credential = GoogleAuthProvider.getCredential( 56 | accessToken: googleAuth.accessToken, 57 | idToken: googleAuth.idToken, 58 | ); 59 | 60 | final FirebaseUser user = (await _auth.signInWithCredential(credential)).user; 61 | 62 | if (user != null) { 63 | return exposeUser(kUsername: user.displayName, kUID: user.uid); 64 | } 65 | return null; 66 | } 67 | 68 | Future> signInAnonymously() async { 69 | final FirebaseUser user = (await _auth.signInAnonymously()).user; 70 | 71 | if (user != null) { 72 | return exposeUser(kUsername: '', kUID: user.uid); 73 | } 74 | return null; 75 | } 76 | -------------------------------------------------------------------------------- /lib/services/constants.dart: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Mahmud Ahsan 3 | * https://github.com/mahmudahsan 4 | */ 5 | const String kUsername = 'username'; 6 | const String kUID = 'uid'; 7 | -------------------------------------------------------------------------------- /lib/services/services.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | /** 3 | * Created by Mahmud Ahsan 4 | * https://github.com/mahmudahsan 5 | */ 6 | import "package:flutter_firebase_vote/models/vote.dart"; 7 | import 'package:uuid/uuid.dart'; 8 | import 'package:cloud_firestore/cloud_firestore.dart'; 9 | import "package:provider/provider.dart"; 10 | import "package:flutter_firebase_vote/state/vote.dart"; 11 | 12 | List getVoteList() { 13 | // Mock Data 14 | List voteList = List(); 15 | 16 | voteList.add(Vote( 17 | voteId: Uuid().v4(), 18 | voteTitle: 'Best Mobile Frameworks?', 19 | options: [ 20 | {'Flutter': 70}, 21 | {'React Native': 10}, 22 | {'Xamarin': 1}, 23 | ], 24 | )); 25 | 26 | voteList.add(Vote( 27 | voteId: Uuid().v4(), 28 | voteTitle: 'Best Web Frontend Frameworks?', 29 | options: [ 30 | {'React': 80}, 31 | {'Angular': 40}, 32 | {'Vue': 20}, 33 | ], 34 | )); 35 | 36 | voteList.add(Vote( 37 | voteId: Uuid().v4(), 38 | voteTitle: 'Best Web Backend Frameworks?', 39 | options: [ 40 | {'Django': 50}, 41 | {'Laravel': 30}, 42 | {'Express.js': 50}, 43 | ], 44 | )); 45 | 46 | return voteList; 47 | } 48 | 49 | // firestore collection name 50 | const String kVotes = 'votes'; 51 | const String kTitle = 'title'; 52 | 53 | void getVoteListFromFirestore(BuildContext context) async { 54 | // Firestore.instance.collection(kVotes).snapshots().listen((data) { 55 | // List voteList = List(); 56 | // 57 | // data.documents.forEach((DocumentSnapshot document) { 58 | // Vote vote = Vote(voteId: document.documentID); 59 | // 60 | // List> options = List(); 61 | // 62 | // document.data.forEach((key, value) { 63 | // if (key == kTitle) { 64 | // vote.voteTitle = value; 65 | // } else { 66 | // options.add({key: value}); 67 | // } 68 | // }); 69 | // 70 | // vote.options = options; 71 | // voteList.add(vote); 72 | // }); 73 | // 74 | // Provider.of(context, listen: false).voteList = voteList; 75 | // }); 76 | 77 | Firestore.instance.collection(kVotes).getDocuments().then((snapshot) { 78 | List voteList = List(); 79 | 80 | snapshot.documents.forEach((DocumentSnapshot document) { 81 | voteList.add(mapFirestoreDocToVote(document)); 82 | }); 83 | 84 | Provider.of(context, listen: false).voteList = voteList; 85 | }); 86 | } 87 | 88 | Vote mapFirestoreDocToVote(document) { 89 | Vote vote = Vote(voteId: document.documentID); 90 | List> options = List(); 91 | document.data.forEach((key, value) { 92 | if (key == kTitle) { 93 | vote.voteTitle = value; 94 | } else { 95 | options.add({key: value}); 96 | } 97 | }); 98 | 99 | vote.options = options; 100 | return vote; 101 | } 102 | 103 | void markVote(String voteId, String option) async { 104 | // increment value 105 | 106 | Firestore.instance.collection(kVotes).document(voteId).updateData({ 107 | option: FieldValue.increment(1), 108 | }); 109 | } 110 | 111 | void retrieveMarkedVoteFromFirestore({String voteId, BuildContext context}) { 112 | // Retrieve updated doc from server 113 | Firestore.instance.collection(kVotes).document(voteId).get().then((document) { 114 | Provider.of(context, listen: false).activeVote = 115 | mapFirestoreDocToVote(document); 116 | }); 117 | } 118 | -------------------------------------------------------------------------------- /lib/state/authentication.dart: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Mahmud Ahsan 3 | * https://github.com/mahmudahsan 4 | */ 5 | import "package:flutter/material.dart"; 6 | import "package:flutter_firebase_vote/services/authentication.dart"; 7 | import '../services/constants.dart'; 8 | 9 | const String kAuthError = 'error'; 10 | const String kAuthSuccess = 'success'; 11 | const String kAuthLoading = 'loading'; 12 | const String kAuthSignInGoogle = 'google'; 13 | const String kAuthSignInAnonymous = 'anonymous'; 14 | 15 | class AuthenticationState with ChangeNotifier { 16 | String _authStatus; 17 | String _username; 18 | String _uid; 19 | 20 | String get authStatus => _authStatus; 21 | String get username => _username; 22 | String get uid => _uid; 23 | 24 | AuthenticationState() { 25 | clearState(); 26 | // checkAuthentication(); 27 | 28 | onAuthenticationChange((user) { 29 | if (user != null) { 30 | _authStatus = kAuthSuccess; 31 | _username = user[kUsername]; 32 | _uid = user[kUID]; 33 | } else { 34 | clearState(); 35 | } 36 | 37 | notifyListeners(); 38 | }); 39 | } 40 | 41 | void checkAuthentication() async { 42 | _authStatus = kAuthLoading; 43 | 44 | if (await isUserSignedIn()) { 45 | _authStatus = kAuthSuccess; 46 | } else { 47 | _authStatus = kAuthError; 48 | } 49 | 50 | Map user = await getCurrentUser(); 51 | _username = user != null ? user[kUsername] : ''; 52 | _uid = user != null ? user[kUID] : ''; 53 | 54 | notifyListeners(); 55 | } 56 | 57 | void clearState() { 58 | _authStatus = null; 59 | _username = null; 60 | _uid = null; 61 | } 62 | 63 | void login({String serviceName}) { 64 | if (serviceName == kAuthSignInGoogle) { 65 | signInWithGoogle(); 66 | } else if (serviceName == kAuthSignInAnonymous) { 67 | signInAnonymously(); 68 | } 69 | } 70 | 71 | void logout() { 72 | clearState(); 73 | signOut(); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /lib/state/vote.dart: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Mahmud Ahsan 3 | * https://github.com/mahmudahsan 4 | */ 5 | 6 | import "package:flutter/material.dart"; 7 | import "package:flutter_firebase_vote/models/vote.dart"; 8 | import 'package:flutter_firebase_vote/services/services.dart'; 9 | 10 | class VoteState with ChangeNotifier { 11 | List _voteList; 12 | Vote _activeVote; 13 | String _selectedOptionInActiveVote; 14 | 15 | void loadVoteList(BuildContext context) async { 16 | // _voteList = getVoteList(); 17 | getVoteListFromFirestore(context); 18 | } 19 | 20 | void clearState() { 21 | _voteList = null; 22 | _activeVote = null; 23 | _selectedOptionInActiveVote = null; 24 | } 25 | 26 | List get voteList => _voteList; 27 | set voteList(newValue) { 28 | _voteList = newValue; 29 | notifyListeners(); 30 | } 31 | 32 | Vote get activeVote => _activeVote; 33 | String get selectedOptionInActiveVote => _selectedOptionInActiveVote; 34 | 35 | set activeVote(newValue) { 36 | _activeVote = newValue; 37 | notifyListeners(); 38 | } 39 | 40 | void set selectedOptionInActiveVote(String newValue) { 41 | _selectedOptionInActiveVote = newValue; 42 | notifyListeners(); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /lib/utilities.dart: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Mahmud Ahsan 3 | * https://github.com/mahmudahsan 4 | */ 5 | import "package:flutter/material.dart"; 6 | import "package:provider/provider.dart"; 7 | import "package:flutter_firebase_vote/state/authentication.dart"; 8 | 9 | void gotoHomeScreen(BuildContext context, AuthenticationState authState) { 10 | Future.microtask(() { 11 | if (authState.authStatus == kAuthSuccess) { 12 | Navigator.pushReplacementNamed(context, '/home'); 13 | } 14 | }); 15 | } 16 | 17 | void gotoLoginScreen(BuildContext context, AuthenticationState authState) { 18 | Future.microtask(() { 19 | if (authState.authStatus == null) { 20 | Navigator.pushReplacementNamed(context, '/'); 21 | } 22 | }); 23 | } 24 | -------------------------------------------------------------------------------- /lib/widgets/shared_widgets.dart: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Mahmud Ahsan 3 | * https://github.com/mahmudahsan 4 | */ 5 | import 'package:flutter/material.dart'; 6 | 7 | class LoginButton extends StatelessWidget { 8 | String label; 9 | double size; 10 | Function onPressed; 11 | 12 | LoginButton({this.label, this.size = 300.0, this.onPressed}); 13 | 14 | @override 15 | Widget build(BuildContext context) { 16 | return Container( 17 | width: size, 18 | child: MaterialButton( 19 | height: 60.0, 20 | padding: EdgeInsets.all(15.0), 21 | shape: RoundedRectangleBorder( 22 | borderRadius: BorderRadius.circular(10), 23 | ), 24 | color: Colors.blueAccent[200], 25 | child: Text( 26 | label, 27 | style: TextStyle( 28 | fontSize: 25.0, 29 | color: Colors.white, 30 | ), 31 | ), 32 | onPressed: onPressed, 33 | ), 34 | ); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/widgets/vote.dart: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Mahmud Ahsan 3 | * https://github.com/mahmudahsan 4 | */ 5 | 6 | import "package:flutter/material.dart"; 7 | import "package:provider/provider.dart"; 8 | import "package:flutter_firebase_vote/models/vote.dart"; 9 | import "package:flutter_firebase_vote/state/vote.dart"; 10 | 11 | class VoteWidget extends StatelessWidget { 12 | @override 13 | Widget build(BuildContext context) { 14 | return Consumer(builder: (context, voteState, child) { 15 | Vote activeVote = voteState.activeVote; 16 | List options = List(); 17 | 18 | for (Map option in activeVote.options) { 19 | option.forEach((title, value) { 20 | options.add(title); 21 | }); 22 | } 23 | 24 | return Column( 25 | children: [ 26 | Card( 27 | child: Container( 28 | width: MediaQuery.of(context).size.width, 29 | padding: EdgeInsets.all(20), 30 | child: Text( 31 | activeVote.voteTitle, 32 | style: TextStyle( 33 | fontSize: 22, 34 | fontWeight: FontWeight.bold, 35 | color: Colors.teal, 36 | ), 37 | ), 38 | ), 39 | ), 40 | for (String option in options) 41 | Card( 42 | child: InkWell( 43 | onTap: () { 44 | voteState.selectedOptionInActiveVote = option; 45 | }, 46 | child: IntrinsicHeight( 47 | child: Row( 48 | crossAxisAlignment: CrossAxisAlignment.start, 49 | children: [ 50 | Container( 51 | constraints: BoxConstraints(minHeight: 60), 52 | width: 8, 53 | color: Colors.green, 54 | ), 55 | Expanded( 56 | child: Container( 57 | padding: EdgeInsets.only(left: 10, right: 5), 58 | alignment: Alignment.centerLeft, 59 | child: Text( 60 | option, 61 | maxLines: 5, 62 | style: TextStyle(fontSize: 22), 63 | ), 64 | color: voteState.selectedOptionInActiveVote == option 65 | ? Colors.green 66 | : Colors.white, 67 | ), 68 | ), 69 | ], 70 | ), 71 | ), 72 | ), 73 | ), 74 | ], 75 | ); 76 | }); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /lib/widgets/vote_list.dart: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by Mahmud Ahsan 3 | * https://github.com/mahmudahsan 4 | */ 5 | import "package:flutter/material.dart"; 6 | import 'package:provider/provider.dart'; 7 | import 'package:flutter_firebase_vote/state/vote.dart'; 8 | import "package:flutter_firebase_vote/models/vote.dart"; 9 | 10 | class VoteListWidget extends StatelessWidget { 11 | @override 12 | Widget build(BuildContext context) { 13 | Function alternateColor = getAlternate(start: 0); 14 | return Consumer( 15 | builder: (context, voteState, child) { 16 | String activeVoteId = voteState.activeVote?.voteId ?? ''; 17 | 18 | return Column( 19 | children: [ 20 | for (Vote vote in voteState.voteList) 21 | Card( 22 | child: ListTile( 23 | title: Container( 24 | padding: EdgeInsets.all(15.0), 25 | child: Text( 26 | vote.voteTitle, 27 | style: TextStyle( 28 | fontSize: 18, 29 | color: activeVoteId == vote.voteId 30 | ? Colors.white 31 | : Colors.black, 32 | fontWeight: activeVoteId == vote.voteId 33 | ? FontWeight.bold 34 | : FontWeight.normal, 35 | ), 36 | ), 37 | ), 38 | selected: activeVoteId == vote.voteId ? true : false, 39 | onTap: () { 40 | voteState.activeVote = vote; 41 | }, 42 | ), 43 | color: activeVoteId == vote.voteId 44 | ? Colors.red[200] 45 | : alternateColor(), 46 | ), 47 | ], 48 | ); 49 | }, 50 | ); 51 | } 52 | 53 | Function getAlternate({int start = 0}) { 54 | int indexNum = start; 55 | 56 | Color getColor() { 57 | Color color = Colors.teal[100]; 58 | 59 | if (indexNum % 2 == 0) { 60 | color = Colors.blueAccent[100]; 61 | } 62 | ++indexNum; 63 | return color; 64 | } 65 | 66 | return getColor; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | archive: 5 | dependency: transitive 6 | description: 7 | name: archive 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "2.0.13" 11 | args: 12 | dependency: transitive 13 | description: 14 | name: args 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "1.6.0" 18 | async: 19 | dependency: transitive 20 | description: 21 | name: async 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "2.4.1" 25 | boolean_selector: 26 | dependency: transitive 27 | description: 28 | name: boolean_selector 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "2.0.0" 32 | charcode: 33 | dependency: transitive 34 | description: 35 | name: charcode 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "1.1.3" 39 | charts_common: 40 | dependency: transitive 41 | description: 42 | name: charts_common 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "0.9.0" 46 | charts_flutter: 47 | dependency: "direct main" 48 | description: 49 | name: charts_flutter 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "0.9.0" 53 | cloud_firestore: 54 | dependency: "direct main" 55 | description: 56 | name: cloud_firestore 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "0.13.6" 60 | cloud_firestore_platform_interface: 61 | dependency: transitive 62 | description: 63 | name: cloud_firestore_platform_interface 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "1.1.2" 67 | cloud_firestore_web: 68 | dependency: transitive 69 | description: 70 | name: cloud_firestore_web 71 | url: "https://pub.dartlang.org" 72 | source: hosted 73 | version: "0.1.1+2" 74 | collection: 75 | dependency: transitive 76 | description: 77 | name: collection 78 | url: "https://pub.dartlang.org" 79 | source: hosted 80 | version: "1.14.12" 81 | convert: 82 | dependency: transitive 83 | description: 84 | name: convert 85 | url: "https://pub.dartlang.org" 86 | source: hosted 87 | version: "2.1.1" 88 | crypto: 89 | dependency: transitive 90 | description: 91 | name: crypto 92 | url: "https://pub.dartlang.org" 93 | source: hosted 94 | version: "2.1.4" 95 | cupertino_icons: 96 | dependency: "direct main" 97 | description: 98 | name: cupertino_icons 99 | url: "https://pub.dartlang.org" 100 | source: hosted 101 | version: "0.1.3" 102 | firebase: 103 | dependency: transitive 104 | description: 105 | name: firebase 106 | url: "https://pub.dartlang.org" 107 | source: hosted 108 | version: "7.3.0" 109 | firebase_auth: 110 | dependency: "direct main" 111 | description: 112 | name: firebase_auth 113 | url: "https://pub.dartlang.org" 114 | source: hosted 115 | version: "0.16.1" 116 | firebase_auth_platform_interface: 117 | dependency: transitive 118 | description: 119 | name: firebase_auth_platform_interface 120 | url: "https://pub.dartlang.org" 121 | source: hosted 122 | version: "1.1.8" 123 | firebase_auth_web: 124 | dependency: transitive 125 | description: 126 | name: firebase_auth_web 127 | url: "https://pub.dartlang.org" 128 | source: hosted 129 | version: "0.1.3+1" 130 | firebase_core: 131 | dependency: transitive 132 | description: 133 | name: firebase_core 134 | url: "https://pub.dartlang.org" 135 | source: hosted 136 | version: "0.4.5" 137 | firebase_core_platform_interface: 138 | dependency: transitive 139 | description: 140 | name: firebase_core_platform_interface 141 | url: "https://pub.dartlang.org" 142 | source: hosted 143 | version: "1.0.4" 144 | firebase_core_web: 145 | dependency: transitive 146 | description: 147 | name: firebase_core_web 148 | url: "https://pub.dartlang.org" 149 | source: hosted 150 | version: "0.1.1+2" 151 | flutter: 152 | dependency: "direct main" 153 | description: flutter 154 | source: sdk 155 | version: "0.0.0" 156 | flutter_test: 157 | dependency: "direct dev" 158 | description: flutter 159 | source: sdk 160 | version: "0.0.0" 161 | flutter_web_plugins: 162 | dependency: transitive 163 | description: flutter 164 | source: sdk 165 | version: "0.0.0" 166 | google_sign_in: 167 | dependency: "direct main" 168 | description: 169 | name: google_sign_in 170 | url: "https://pub.dartlang.org" 171 | source: hosted 172 | version: "4.5.1" 173 | google_sign_in_platform_interface: 174 | dependency: transitive 175 | description: 176 | name: google_sign_in_platform_interface 177 | url: "https://pub.dartlang.org" 178 | source: hosted 179 | version: "1.1.2" 180 | google_sign_in_web: 181 | dependency: transitive 182 | description: 183 | name: google_sign_in_web 184 | url: "https://pub.dartlang.org" 185 | source: hosted 186 | version: "0.9.1+1" 187 | http: 188 | dependency: transitive 189 | description: 190 | name: http 191 | url: "https://pub.dartlang.org" 192 | source: hosted 193 | version: "0.12.1" 194 | http_parser: 195 | dependency: transitive 196 | description: 197 | name: http_parser 198 | url: "https://pub.dartlang.org" 199 | source: hosted 200 | version: "3.1.4" 201 | image: 202 | dependency: transitive 203 | description: 204 | name: image 205 | url: "https://pub.dartlang.org" 206 | source: hosted 207 | version: "2.1.12" 208 | intl: 209 | dependency: transitive 210 | description: 211 | name: intl 212 | url: "https://pub.dartlang.org" 213 | source: hosted 214 | version: "0.16.1" 215 | js: 216 | dependency: transitive 217 | description: 218 | name: js 219 | url: "https://pub.dartlang.org" 220 | source: hosted 221 | version: "0.6.1+1" 222 | loading: 223 | dependency: "direct main" 224 | description: 225 | name: loading 226 | url: "https://pub.dartlang.org" 227 | source: hosted 228 | version: "1.0.2" 229 | logging: 230 | dependency: transitive 231 | description: 232 | name: logging 233 | url: "https://pub.dartlang.org" 234 | source: hosted 235 | version: "0.11.4" 236 | matcher: 237 | dependency: transitive 238 | description: 239 | name: matcher 240 | url: "https://pub.dartlang.org" 241 | source: hosted 242 | version: "0.12.6" 243 | meta: 244 | dependency: transitive 245 | description: 246 | name: meta 247 | url: "https://pub.dartlang.org" 248 | source: hosted 249 | version: "1.1.8" 250 | nested: 251 | dependency: transitive 252 | description: 253 | name: nested 254 | url: "https://pub.dartlang.org" 255 | source: hosted 256 | version: "0.0.4" 257 | path: 258 | dependency: transitive 259 | description: 260 | name: path 261 | url: "https://pub.dartlang.org" 262 | source: hosted 263 | version: "1.6.4" 264 | pedantic: 265 | dependency: transitive 266 | description: 267 | name: pedantic 268 | url: "https://pub.dartlang.org" 269 | source: hosted 270 | version: "1.9.0" 271 | petitparser: 272 | dependency: transitive 273 | description: 274 | name: petitparser 275 | url: "https://pub.dartlang.org" 276 | source: hosted 277 | version: "2.4.0" 278 | plugin_platform_interface: 279 | dependency: transitive 280 | description: 281 | name: plugin_platform_interface 282 | url: "https://pub.dartlang.org" 283 | source: hosted 284 | version: "1.0.2" 285 | provider: 286 | dependency: "direct main" 287 | description: 288 | name: provider 289 | url: "https://pub.dartlang.org" 290 | source: hosted 291 | version: "4.1.2" 292 | quiver: 293 | dependency: transitive 294 | description: 295 | name: quiver 296 | url: "https://pub.dartlang.org" 297 | source: hosted 298 | version: "2.1.3" 299 | sky_engine: 300 | dependency: transitive 301 | description: flutter 302 | source: sdk 303 | version: "0.0.99" 304 | source_span: 305 | dependency: transitive 306 | description: 307 | name: source_span 308 | url: "https://pub.dartlang.org" 309 | source: hosted 310 | version: "1.7.0" 311 | stack_trace: 312 | dependency: transitive 313 | description: 314 | name: stack_trace 315 | url: "https://pub.dartlang.org" 316 | source: hosted 317 | version: "1.9.3" 318 | stream_channel: 319 | dependency: transitive 320 | description: 321 | name: stream_channel 322 | url: "https://pub.dartlang.org" 323 | source: hosted 324 | version: "2.0.0" 325 | string_scanner: 326 | dependency: transitive 327 | description: 328 | name: string_scanner 329 | url: "https://pub.dartlang.org" 330 | source: hosted 331 | version: "1.0.5" 332 | term_glyph: 333 | dependency: transitive 334 | description: 335 | name: term_glyph 336 | url: "https://pub.dartlang.org" 337 | source: hosted 338 | version: "1.1.0" 339 | test_api: 340 | dependency: transitive 341 | description: 342 | name: test_api 343 | url: "https://pub.dartlang.org" 344 | source: hosted 345 | version: "0.2.15" 346 | typed_data: 347 | dependency: transitive 348 | description: 349 | name: typed_data 350 | url: "https://pub.dartlang.org" 351 | source: hosted 352 | version: "1.1.6" 353 | uuid: 354 | dependency: "direct main" 355 | description: 356 | name: uuid 357 | url: "https://pub.dartlang.org" 358 | source: hosted 359 | version: "2.0.4" 360 | vector_math: 361 | dependency: transitive 362 | description: 363 | name: vector_math 364 | url: "https://pub.dartlang.org" 365 | source: hosted 366 | version: "2.0.8" 367 | xml: 368 | dependency: transitive 369 | description: 370 | name: xml 371 | url: "https://pub.dartlang.org" 372 | source: hosted 373 | version: "3.6.1" 374 | sdks: 375 | dart: ">=2.7.0 <3.0.0" 376 | flutter: ">=1.16.0 <2.0.0" 377 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: flutter_firebase_vote 2 | description: A new Flutter application. 3 | 4 | # The following defines the version and build number for your application. 5 | # A version number is three numbers separated by dots, like 1.2.43 6 | # followed by an optional build number separated by a +. 7 | # Both the version and the builder number may be overridden in flutter 8 | # build by specifying --build-name and --build-number, respectively. 9 | # In Android, build-name is used as versionName while build-number used as versionCode. 10 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 11 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 12 | # Read more about iOS versioning at 13 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 14 | version: 1.0.0+1 15 | 16 | environment: 17 | sdk: ">=2.2.2 <3.0.0" 18 | 19 | dependencies: 20 | flutter: 21 | sdk: flutter 22 | 23 | # The following adds the Cupertino Icons font to your application. 24 | # Use with the CupertinoIcons class for iOS style icons. 25 | cupertino_icons: ^0.1.3 26 | uuid: ^2.0.4 27 | provider: ^4.1.2 28 | charts_flutter: ^0.9.0 29 | firebase_auth: ^0.16.1 30 | google_sign_in: ^4.5.1 31 | cloud_firestore: ^0.13.6 32 | loading: ^1.0.2 33 | 34 | dev_dependencies: 35 | flutter_test: 36 | sdk: flutter 37 | 38 | 39 | # For information on the generic Dart part of this file, see the 40 | # following page: https://dart.dev/tools/pub/pubspec 41 | 42 | # The following section is specific to Flutter. 43 | flutter: 44 | 45 | # The following line ensures that the Material Icons font is 46 | # included with your application, so that you can use the icons in 47 | # the material Icons class. 48 | uses-material-design: true 49 | 50 | # To add assets to your application, add an assets section, like this: 51 | # assets: 52 | # - images/a_dot_burr.jpeg 53 | # - images/a_dot_ham.jpeg 54 | 55 | # An image asset can refer to one or more resolution-specific "variants", see 56 | # https://flutter.dev/assets-and-images/#resolution-aware. 57 | 58 | # For details regarding adding assets from package dependencies, see 59 | # https://flutter.dev/assets-and-images/#from-packages 60 | 61 | # To add custom fonts to your application, add a fonts section here, 62 | # in this "flutter" section. Each entry in this list should have a 63 | # "family" key with the font family name, and a "fonts" key with a 64 | # list giving the asset and other descriptors for the font. For 65 | # example: 66 | # fonts: 67 | # - family: Schyler 68 | # fonts: 69 | # - asset: fonts/Schyler-Regular.ttf 70 | # - asset: fonts/Schyler-Italic.ttf 71 | # style: italic 72 | # - family: Trajan Pro 73 | # fonts: 74 | # - asset: fonts/TrajanPro.ttf 75 | # - asset: fonts/TrajanPro_Bold.ttf 76 | # weight: 700 77 | # 78 | # For details regarding fonts from package dependencies, 79 | # see https://flutter.dev/custom-fonts/#from-packages 80 | -------------------------------------------------------------------------------- /resource/model.drawio: -------------------------------------------------------------------------------- 1 | 7VrZcts2FP0aPSbDXdSjJC9J60w9VRvbTxmQhETUIKGQoJZ8fS5IQCQFyHUcyUo79ng8xMVC4py7Ah6402xzXaBl+oklmA4cK9kM3IuB44QjB/4KwbYRDG2rESwKkjQiuxXMyDcshWpYRRJc9gZyxigny74wZnmOY96ToaJg6/6wOaP9ty7RAmuCWYyoLr0jCU/ltpxhK/+AySJVb7aDUdOTITVY7qRMUcLWHZF7OXCnBWO8eco2U0wFdgqXZt7Vgd7dhxU458+ZML4c2u8WOb+P8O/rknzwPk/v3slVVohWcsPjmLNCfjHfKhjg45fiscpoM8CdrHDBCQB1gyJMb1lJOGE5DIkY5yyDAVR0TFD8uChYlSdTRsU8WM2d1z+dNcaULMRczpYgTXlGoWHDI6s4JTme7ti1QKjvXG0DlsObjkgicY1ZhnmxhSGy1/UkK1vFm2yvW5JdKUo7/AZShqRaLXYrt8jDgwT/B4hwNCI+M45BYmtc1GjiRIKxTgnHsyWKRe8abLAP4JxQ2kEe24mPhyAvecEecadnFAxdFBwHXdvtoxvq4Nrea6LrHkLX+R+gawfnhnd4AN59J7ImGUU5FsCxnM9kj8A5TglNbtAW7B0kJQevoVqTlBXkG4xHCnXoLrgMFU6wR0PO6he0k2ZiMfmaApcw7Vahb++JPqFNb+ANKpXPiRmlaFmSqP5kMTFDxYLkE+nt6kH1rprvsv3TkO34OtmOZSDbtrwTsR1qbK+A7Y+JxjdskWvGIPkxUIZkEKB4zg/GhhJskeSLm3rMhddK/pRbFyIGc+e0DrYpSRKcC0YZRxxFO41bMpLzGhp/Ar+A4NR67w98+PAptO22Db9ieMEhCsFeEKnJxKAbayz04xm0P2k1/64LivvgedSrcUdnfmRk/i/CqW7sb+Qfl3zfOTP5KkPqsM+WTc43BnFeZREuvrD5l5XJ97+pw3HVYRi+njpcP4Tr3+6yhznBrvO1+pbkLlJRoEMxTqBykk1AKGULliN62Uon/dyqHXPDBJ91VP0Hc76VAKKKs36+hTeE33eeH8RS733ZulDRu25sVSOH7d53G51ZotlOq1tqXpfJQLY7GZ1lDa+urnYMi833Qrwh6pesKmL8BKaqwIXMAvMnxnlm1SgwRZys+t9xdOL1kvEGVXmcgmwWFxgMzAmoMIUIyshgwWuIWklHY4KvFVM2866soRaexA6Wm7Zzt4Y/uWZsISKNNRNewLE+5rWJHmXtMTiebcaqUlv+p+qDfR3q1wvzMMZxbKoXotD3/LbW1fyCQb8Op5CW30shPddQL4SmFNI5QsFg1CG92v0AK3c06JSgz+eOGfQkiAI/OA7ortcHfWiqgU2gh6fCXMXv83js1ks/dHrMHvsMntd7pucdndPzeprVjCsu/O5twVYkwfqx3THtJvFxmHgmuwmdyA1OZDeeod59XbvxD6E+w8WKAJZauLsiBY5QKfxZM/SUrCAczo3eLIhDHM2Pw0pgWb8YK/qRk+7d8mQsbgCgFVNUliRWZ0e6+AnAX5o/viRXPYNH883Ed4j1Dbwq2bMdn3zDrai0DqcmI3tPX5ptyllO53JjbyF/uOc2RnsLNThoC9W6t9v2TwRX/Zj+Fw2urTq3GvzQU+BfphwaPVOFnXMGZds9C/MHWLT/uyweiECvw6J+srkL6/tFrIBsIC6cFWptNQm1hQs/eoEpM4ZpiuNHtQ58Z7NUf3kQd165nzmkLIugRv3xrOFJnn8uYxv2c4PAcJVqm+5SbetkpY5eX/5divS4Lu3B7uri/sARZQfF+haoc04o7LCUqHYOKWNACnevxNUxZUaSpLb3/gHjxcB45mk8G+17ilek1dsvYE2nBo7pxPFkrOr1zz6rf1T8jdYnad3Ro6zVdHlsstYX0ArN9t9bmkyr/R8h9/I7 -------------------------------------------------------------------------------- /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:flutter_firebase_vote/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(VoteApp()); 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 | --------------------------------------------------------------------------------