├── .gitignore ├── .metadata ├── .vscode └── launch.json ├── README.md ├── android ├── .gitignore ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── starter │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable-v21 │ │ │ └── launch_background.xml │ │ │ ├── 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-night │ │ │ └── styles.xml │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets └── fonts │ ├── poppins_bold.ttf │ ├── poppins_bold_italic.ttf │ ├── poppins_extra_bold.ttf │ ├── poppins_extra_bold_italic.ttf │ ├── poppins_italic.ttf │ ├── poppins_light.ttf │ ├── poppins_light_italic.ttf │ ├── poppins_medium.ttf │ ├── poppins_medium_italic.ttf │ ├── poppins_regular.ttf │ ├── poppins_semi_bold.ttf │ └── poppins_semi_bold_italic.ttf ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Podfile ├── Podfile.lock ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── Runner │ ├── AppDelegate.swift │ ├── 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 │ ├── Info.plist │ └── Runner-Bridging-Header.h ├── lib ├── app │ ├── app.dart │ ├── app_binding.dart │ ├── app_controller.dart │ ├── data │ │ ├── models │ │ │ ├── dto │ │ │ │ ├── response.dart │ │ │ │ └── user.dart │ │ │ ├── request │ │ │ │ └── auth_request.dart │ │ │ └── response │ │ │ │ ├── app_config_response.dart │ │ │ │ ├── error_response.dart │ │ │ │ └── user_response.dart │ │ ├── network │ │ │ └── network_requester.dart │ │ ├── repository │ │ │ ├── config_repository.dart │ │ │ └── user_repository.dart │ │ └── values │ │ │ ├── constants.dart │ │ │ ├── env.dart │ │ │ ├── images.dart │ │ │ ├── strings.dart │ │ │ └── urls.dart │ ├── modules │ │ ├── auth │ │ │ ├── login │ │ │ │ ├── bindings │ │ │ │ │ └── auth_login_binding.dart │ │ │ │ ├── controllers │ │ │ │ │ └── auth_login_controller.dart │ │ │ │ └── views │ │ │ │ │ └── auth_login_view.dart │ │ │ ├── signup │ │ │ │ ├── bindings │ │ │ │ │ └── auth_signup_binding.dart │ │ │ │ ├── controllers │ │ │ │ │ └── auth_signup_controller.dart │ │ │ │ └── views │ │ │ │ │ └── auth_signup_view.dart │ │ │ └── verify-otp │ │ │ │ ├── bindings │ │ │ │ └── auth_verify_otp_binding.dart │ │ │ │ ├── controllers │ │ │ │ └── auth_verify_otp_controller.dart │ │ │ │ └── views │ │ │ │ └── auth_verify_otp_view.dart │ │ ├── home │ │ │ ├── bindings │ │ │ │ └── home_binding.dart │ │ │ ├── controllers │ │ │ │ └── home_controller.dart │ │ │ └── views │ │ │ │ └── home_view.dart │ │ └── splash │ │ │ ├── bindings │ │ │ └── splash_binding.dart │ │ │ ├── controllers │ │ │ └── splash_controller.dart │ │ │ └── views │ │ │ └── splash_view.dart │ ├── routes │ │ ├── app_pages.dart │ │ └── app_routes.dart │ └── theme │ │ ├── app_colors.dart │ │ ├── app_theme.dart │ │ └── styles.dart ├── base │ ├── base_controller.dart │ └── base_repository.dart ├── main.dart ├── utils │ ├── helper │ │ ├── exception_handler.dart │ │ ├── text_field_wrapper.dart │ │ └── validators.dart │ ├── loading │ │ └── loading_utils.dart │ └── storage │ │ └── storage_utils.dart └── widgets │ ├── base │ └── shimmer_widget.dart │ ├── buttons │ └── primary_filled_button.dart │ └── text_field │ └── custom_text_field.dart ├── pubspec.yaml ├── test └── widget_test.dart └── web ├── favicon.png ├── icons ├── Icon-192.png └── Icon-512.png ├── index.html └── manifest.json /.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/settings.json 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | **/ios/Flutter/.last_build_id 26 | .dart_tool/ 27 | .flutter-plugins 28 | .flutter-plugins-dependencies 29 | .packages 30 | .pub-cache/ 31 | .pub/ 32 | /build/ 33 | 34 | # Web related 35 | lib/generated_plugin_registrant.dart 36 | 37 | # Symbolication related 38 | app.*.symbols 39 | 40 | # Obfuscation related 41 | app.*.map.json 42 | pubspec.lock 43 | -------------------------------------------------------------------------------- /.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: 9b2d32b605630f28625709ebd9d78ab3016b2bf6 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "starter", 9 | "request": "launch", 10 | "type": "dart" 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # starter 2 | 3 | A new Flutter project. 4 | 5 | ## Getting Started 6 | 7 | This project is a starting point for a Flutter application. 8 | 9 | A few resources to get you started if this is your first Flutter project: 10 | 11 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) 12 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) 13 | 14 | For help getting started with Flutter, view our 15 | [online documentation](https://flutter.dev/docs), which offers tutorials, 16 | samples, guidance on mobile development, and a full API reference. 17 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id "com.android.application" 3 | id "kotlin-android" 4 | id "dev.flutter.flutter-gradle-plugin" 5 | } 6 | 7 | def localProperties = new Properties() 8 | def localPropertiesFile = rootProject.file('local.properties') 9 | if (localPropertiesFile.exists()) { 10 | localPropertiesFile.withReader('UTF-8') { reader -> 11 | localProperties.load(reader) 12 | } 13 | } 14 | 15 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 16 | if (flutterVersionCode == null) { 17 | flutterVersionCode = '1' 18 | } 19 | 20 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 21 | if (flutterVersionName == null) { 22 | flutterVersionName = '1.0' 23 | } 24 | 25 | android { 26 | compileSdk = 34 27 | 28 | sourceSets { 29 | main.java.srcDirs += 'src/main/kotlin' 30 | } 31 | 32 | defaultConfig { 33 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 34 | applicationId "com.example.starter" 35 | minSdkVersion flutter.minSdkVersion 36 | targetSdkVersion 33 37 | versionCode flutterVersionCode.toInteger() 38 | versionName flutterVersionName 39 | } 40 | 41 | buildTypes { 42 | release { 43 | // TODO: Add your own signing config for the release build. 44 | // Signing with the debug keys for now, so `flutter run --release` works. 45 | signingConfig signingConfigs.debug 46 | } 47 | } 48 | } 49 | 50 | flutter { 51 | source '../..' 52 | } 53 | 54 | dependencies { 55 | } 56 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 7 | 15 | 19 | 22 | 27 | 30 | 31 | 32 | 33 | 34 | 35 | 37 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/starter/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.starter 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /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/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | allprojects { 2 | repositories { 3 | google() 4 | jcenter() 5 | } 6 | } 7 | 8 | rootProject.buildDir = '../build' 9 | subprojects { 10 | project.buildDir = "${rootProject.buildDir}/${project.name}" 11 | } 12 | subprojects { 13 | project.evaluationDependsOn(':app') 14 | } 15 | 16 | tasks.register("clean", Delete) { 17 | delete rootProject.buildDir 18 | } 19 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sat Dec 07 16:16:50 IST 2024 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-all.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | def flutterSdkPath = { 3 | def properties = new Properties() 4 | file("local.properties").withInputStream { properties.load(it) } 5 | def flutterSdkPath = properties.getProperty("flutter.sdk") 6 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 7 | return flutterSdkPath 8 | }() 9 | 10 | includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") 11 | 12 | repositories { 13 | google() 14 | mavenCentral() 15 | gradlePluginPortal() 16 | } 17 | } 18 | 19 | plugins { 20 | id "dev.flutter.flutter-plugin-loader" version "1.0.0" 21 | id "com.android.application" version "7.0.1" apply false 22 | id "org.jetbrains.kotlin.android" version "1.9.0" apply false 23 | } 24 | 25 | include ":app" -------------------------------------------------------------------------------- /assets/fonts/poppins_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/assets/fonts/poppins_bold.ttf -------------------------------------------------------------------------------- /assets/fonts/poppins_bold_italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/assets/fonts/poppins_bold_italic.ttf -------------------------------------------------------------------------------- /assets/fonts/poppins_extra_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/assets/fonts/poppins_extra_bold.ttf -------------------------------------------------------------------------------- /assets/fonts/poppins_extra_bold_italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/assets/fonts/poppins_extra_bold_italic.ttf -------------------------------------------------------------------------------- /assets/fonts/poppins_italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/assets/fonts/poppins_italic.ttf -------------------------------------------------------------------------------- /assets/fonts/poppins_light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/assets/fonts/poppins_light.ttf -------------------------------------------------------------------------------- /assets/fonts/poppins_light_italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/assets/fonts/poppins_light_italic.ttf -------------------------------------------------------------------------------- /assets/fonts/poppins_medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/assets/fonts/poppins_medium.ttf -------------------------------------------------------------------------------- /assets/fonts/poppins_medium_italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/assets/fonts/poppins_medium_italic.ttf -------------------------------------------------------------------------------- /assets/fonts/poppins_regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/assets/fonts/poppins_regular.ttf -------------------------------------------------------------------------------- /assets/fonts/poppins_semi_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/assets/fonts/poppins_semi_bold.ttf -------------------------------------------------------------------------------- /assets/fonts/poppins_semi_bold_italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/assets/fonts/poppins_semi_bold_italic.ttf -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Flutter.podspec 20 | Flutter/Generated.xcconfig 21 | Flutter/app.flx 22 | Flutter/app.zip 23 | Flutter/flutter_assets/ 24 | Flutter/flutter_export_environment.sh 25 | ServiceDefinitions.json 26 | Runner/GeneratedPluginRegistrant.* 27 | 28 | # Exceptions to above rules. 29 | !default.mode1v3 30 | !default.mode2v3 31 | !default.pbxuser 32 | !default.perspectivev3 33 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def flutter_root 14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) 15 | unless File.exist?(generated_xcode_build_settings_path) 16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" 17 | end 18 | 19 | File.foreach(generated_xcode_build_settings_path) do |line| 20 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 21 | return matches[1].strip if matches 22 | end 23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" 24 | end 25 | 26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 27 | 28 | flutter_ios_podfile_setup 29 | 30 | target 'Runner' do 31 | use_frameworks! 32 | use_modular_headers! 33 | 34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) 35 | end 36 | 37 | post_install do |installer| 38 | installer.pods_project.targets.each do |target| 39 | flutter_additional_ios_build_settings(target) 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Flutter (1.0.0) 3 | - path_provider (0.0.1): 4 | - Flutter 5 | 6 | DEPENDENCIES: 7 | - Flutter (from `Flutter`) 8 | - path_provider (from `.symlinks/plugins/path_provider/ios`) 9 | 10 | EXTERNAL SOURCES: 11 | Flutter: 12 | :path: Flutter 13 | path_provider: 14 | :path: ".symlinks/plugins/path_provider/ios" 15 | 16 | SPEC CHECKSUMS: 17 | Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c 18 | path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c 19 | 20 | PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c 21 | 22 | COCOAPODS: 1.10.1 23 | -------------------------------------------------------------------------------- /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 | 6265383D66033BB03FA9B0C6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5F12EC28EEDF86091B70BAA9 /* Pods_Runner.framework */; }; 13 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 14 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 15 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 16 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXCopyFilesBuildPhase section */ 20 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 21 | isa = PBXCopyFilesBuildPhase; 22 | buildActionMask = 2147483647; 23 | dstPath = ""; 24 | dstSubfolderSpec = 10; 25 | files = ( 26 | ); 27 | name = "Embed Frameworks"; 28 | runOnlyForDeploymentPostprocessing = 0; 29 | }; 30 | /* End PBXCopyFilesBuildPhase section */ 31 | 32 | /* Begin PBXFileReference section */ 33 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 34 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 35 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 36 | 5DA355E967D27C471DB0810C /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 37 | 5F12EC28EEDF86091B70BAA9 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 38 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 39 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 40 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 41 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 42 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 43 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 45 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 46 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 47 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 48 | ADC55D136D145F2F24368F0A /* 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 = ""; }; 49 | E6B94841A9AE39C7BDBA2457 /* 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 = ""; }; 50 | /* End PBXFileReference section */ 51 | 52 | /* Begin PBXFrameworksBuildPhase section */ 53 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 54 | isa = PBXFrameworksBuildPhase; 55 | buildActionMask = 2147483647; 56 | files = ( 57 | 6265383D66033BB03FA9B0C6 /* Pods_Runner.framework in Frameworks */, 58 | ); 59 | runOnlyForDeploymentPostprocessing = 0; 60 | }; 61 | /* End PBXFrameworksBuildPhase section */ 62 | 63 | /* Begin PBXGroup section */ 64 | 52A852735DCC5B80B2E5FF85 /* Pods */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | E6B94841A9AE39C7BDBA2457 /* Pods-Runner.debug.xcconfig */, 68 | ADC55D136D145F2F24368F0A /* Pods-Runner.release.xcconfig */, 69 | 5DA355E967D27C471DB0810C /* Pods-Runner.profile.xcconfig */, 70 | ); 71 | name = Pods; 72 | path = Pods; 73 | sourceTree = ""; 74 | }; 75 | 7FD3E750232F3A4340108E71 /* Frameworks */ = { 76 | isa = PBXGroup; 77 | children = ( 78 | 5F12EC28EEDF86091B70BAA9 /* Pods_Runner.framework */, 79 | ); 80 | name = Frameworks; 81 | sourceTree = ""; 82 | }; 83 | 9740EEB11CF90186004384FC /* Flutter */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 87 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 88 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 89 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 90 | ); 91 | name = Flutter; 92 | sourceTree = ""; 93 | }; 94 | 97C146E51CF9000F007C117D = { 95 | isa = PBXGroup; 96 | children = ( 97 | 9740EEB11CF90186004384FC /* Flutter */, 98 | 97C146F01CF9000F007C117D /* Runner */, 99 | 97C146EF1CF9000F007C117D /* Products */, 100 | 52A852735DCC5B80B2E5FF85 /* Pods */, 101 | 7FD3E750232F3A4340108E71 /* Frameworks */, 102 | ); 103 | sourceTree = ""; 104 | }; 105 | 97C146EF1CF9000F007C117D /* Products */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | 97C146EE1CF9000F007C117D /* Runner.app */, 109 | ); 110 | name = Products; 111 | sourceTree = ""; 112 | }; 113 | 97C146F01CF9000F007C117D /* Runner */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 117 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 118 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 119 | 97C147021CF9000F007C117D /* Info.plist */, 120 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 121 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 122 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 123 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 124 | ); 125 | path = Runner; 126 | sourceTree = ""; 127 | }; 128 | /* End PBXGroup section */ 129 | 130 | /* Begin PBXNativeTarget section */ 131 | 97C146ED1CF9000F007C117D /* Runner */ = { 132 | isa = PBXNativeTarget; 133 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 134 | buildPhases = ( 135 | D16C6579C84870501989774D /* [CP] Check Pods Manifest.lock */, 136 | 9740EEB61CF901F6004384FC /* Run Script */, 137 | 97C146EA1CF9000F007C117D /* Sources */, 138 | 97C146EB1CF9000F007C117D /* Frameworks */, 139 | 97C146EC1CF9000F007C117D /* Resources */, 140 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 141 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 142 | 4592A4D0D41A24B75FDAC78D /* [CP] Embed Pods Frameworks */, 143 | ); 144 | buildRules = ( 145 | ); 146 | dependencies = ( 147 | ); 148 | name = Runner; 149 | productName = Runner; 150 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 151 | productType = "com.apple.product-type.application"; 152 | }; 153 | /* End PBXNativeTarget section */ 154 | 155 | /* Begin PBXProject section */ 156 | 97C146E61CF9000F007C117D /* Project object */ = { 157 | isa = PBXProject; 158 | attributes = { 159 | LastUpgradeCheck = 1020; 160 | ORGANIZATIONNAME = ""; 161 | TargetAttributes = { 162 | 97C146ED1CF9000F007C117D = { 163 | CreatedOnToolsVersion = 7.3.1; 164 | LastSwiftMigration = 1100; 165 | }; 166 | }; 167 | }; 168 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 169 | compatibilityVersion = "Xcode 9.3"; 170 | developmentRegion = en; 171 | hasScannedForEncodings = 0; 172 | knownRegions = ( 173 | en, 174 | Base, 175 | ); 176 | mainGroup = 97C146E51CF9000F007C117D; 177 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 178 | projectDirPath = ""; 179 | projectRoot = ""; 180 | targets = ( 181 | 97C146ED1CF9000F007C117D /* Runner */, 182 | ); 183 | }; 184 | /* End PBXProject section */ 185 | 186 | /* Begin PBXResourcesBuildPhase section */ 187 | 97C146EC1CF9000F007C117D /* Resources */ = { 188 | isa = PBXResourcesBuildPhase; 189 | buildActionMask = 2147483647; 190 | files = ( 191 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 192 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 193 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 194 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | }; 198 | /* End PBXResourcesBuildPhase section */ 199 | 200 | /* Begin PBXShellScriptBuildPhase section */ 201 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 202 | isa = PBXShellScriptBuildPhase; 203 | buildActionMask = 2147483647; 204 | files = ( 205 | ); 206 | inputPaths = ( 207 | ); 208 | name = "Thin Binary"; 209 | outputPaths = ( 210 | ); 211 | runOnlyForDeploymentPostprocessing = 0; 212 | shellPath = /bin/sh; 213 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 214 | }; 215 | 4592A4D0D41A24B75FDAC78D /* [CP] Embed Pods Frameworks */ = { 216 | isa = PBXShellScriptBuildPhase; 217 | buildActionMask = 2147483647; 218 | files = ( 219 | ); 220 | inputFileListPaths = ( 221 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", 222 | ); 223 | name = "[CP] Embed Pods Frameworks"; 224 | outputFileListPaths = ( 225 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", 226 | ); 227 | runOnlyForDeploymentPostprocessing = 0; 228 | shellPath = /bin/sh; 229 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; 230 | showEnvVarsInLog = 0; 231 | }; 232 | 9740EEB61CF901F6004384FC /* Run Script */ = { 233 | isa = PBXShellScriptBuildPhase; 234 | buildActionMask = 2147483647; 235 | files = ( 236 | ); 237 | inputPaths = ( 238 | ); 239 | name = "Run Script"; 240 | outputPaths = ( 241 | ); 242 | runOnlyForDeploymentPostprocessing = 0; 243 | shellPath = /bin/sh; 244 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 245 | }; 246 | D16C6579C84870501989774D /* [CP] Check Pods Manifest.lock */ = { 247 | isa = PBXShellScriptBuildPhase; 248 | buildActionMask = 2147483647; 249 | files = ( 250 | ); 251 | inputFileListPaths = ( 252 | ); 253 | inputPaths = ( 254 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 255 | "${PODS_ROOT}/Manifest.lock", 256 | ); 257 | name = "[CP] Check Pods Manifest.lock"; 258 | outputFileListPaths = ( 259 | ); 260 | outputPaths = ( 261 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 262 | ); 263 | runOnlyForDeploymentPostprocessing = 0; 264 | shellPath = /bin/sh; 265 | 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"; 266 | showEnvVarsInLog = 0; 267 | }; 268 | /* End PBXShellScriptBuildPhase section */ 269 | 270 | /* Begin PBXSourcesBuildPhase section */ 271 | 97C146EA1CF9000F007C117D /* Sources */ = { 272 | isa = PBXSourcesBuildPhase; 273 | buildActionMask = 2147483647; 274 | files = ( 275 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 276 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 277 | ); 278 | runOnlyForDeploymentPostprocessing = 0; 279 | }; 280 | /* End PBXSourcesBuildPhase section */ 281 | 282 | /* Begin PBXVariantGroup section */ 283 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 284 | isa = PBXVariantGroup; 285 | children = ( 286 | 97C146FB1CF9000F007C117D /* Base */, 287 | ); 288 | name = Main.storyboard; 289 | sourceTree = ""; 290 | }; 291 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 292 | isa = PBXVariantGroup; 293 | children = ( 294 | 97C147001CF9000F007C117D /* Base */, 295 | ); 296 | name = LaunchScreen.storyboard; 297 | sourceTree = ""; 298 | }; 299 | /* End PBXVariantGroup section */ 300 | 301 | /* Begin XCBuildConfiguration section */ 302 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 303 | isa = XCBuildConfiguration; 304 | buildSettings = { 305 | ALWAYS_SEARCH_USER_PATHS = NO; 306 | CLANG_ANALYZER_NONNULL = YES; 307 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 308 | CLANG_CXX_LIBRARY = "libc++"; 309 | CLANG_ENABLE_MODULES = YES; 310 | CLANG_ENABLE_OBJC_ARC = YES; 311 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 312 | CLANG_WARN_BOOL_CONVERSION = YES; 313 | CLANG_WARN_COMMA = YES; 314 | CLANG_WARN_CONSTANT_CONVERSION = YES; 315 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 316 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 317 | CLANG_WARN_EMPTY_BODY = YES; 318 | CLANG_WARN_ENUM_CONVERSION = YES; 319 | CLANG_WARN_INFINITE_RECURSION = YES; 320 | CLANG_WARN_INT_CONVERSION = YES; 321 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 322 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 323 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 324 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 325 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 326 | CLANG_WARN_STRICT_PROTOTYPES = YES; 327 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 328 | CLANG_WARN_UNREACHABLE_CODE = YES; 329 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 330 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 331 | COPY_PHASE_STRIP = NO; 332 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 333 | ENABLE_NS_ASSERTIONS = NO; 334 | ENABLE_STRICT_OBJC_MSGSEND = YES; 335 | GCC_C_LANGUAGE_STANDARD = gnu99; 336 | GCC_NO_COMMON_BLOCKS = YES; 337 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 338 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 339 | GCC_WARN_UNDECLARED_SELECTOR = YES; 340 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 341 | GCC_WARN_UNUSED_FUNCTION = YES; 342 | GCC_WARN_UNUSED_VARIABLE = YES; 343 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 344 | MTL_ENABLE_DEBUG_INFO = NO; 345 | SDKROOT = iphoneos; 346 | SUPPORTED_PLATFORMS = iphoneos; 347 | TARGETED_DEVICE_FAMILY = "1,2"; 348 | VALIDATE_PRODUCT = YES; 349 | }; 350 | name = Profile; 351 | }; 352 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 353 | isa = XCBuildConfiguration; 354 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 355 | buildSettings = { 356 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 357 | CLANG_ENABLE_MODULES = YES; 358 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 359 | ENABLE_BITCODE = NO; 360 | INFOPLIST_FILE = Runner/Info.plist; 361 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 362 | PRODUCT_BUNDLE_IDENTIFIER = com.example.starter; 363 | PRODUCT_NAME = "$(TARGET_NAME)"; 364 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 365 | SWIFT_VERSION = 5.0; 366 | VERSIONING_SYSTEM = "apple-generic"; 367 | }; 368 | name = Profile; 369 | }; 370 | 97C147031CF9000F007C117D /* Debug */ = { 371 | isa = XCBuildConfiguration; 372 | buildSettings = { 373 | ALWAYS_SEARCH_USER_PATHS = NO; 374 | CLANG_ANALYZER_NONNULL = YES; 375 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 376 | CLANG_CXX_LIBRARY = "libc++"; 377 | CLANG_ENABLE_MODULES = YES; 378 | CLANG_ENABLE_OBJC_ARC = YES; 379 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 380 | CLANG_WARN_BOOL_CONVERSION = YES; 381 | CLANG_WARN_COMMA = YES; 382 | CLANG_WARN_CONSTANT_CONVERSION = YES; 383 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 384 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 385 | CLANG_WARN_EMPTY_BODY = YES; 386 | CLANG_WARN_ENUM_CONVERSION = YES; 387 | CLANG_WARN_INFINITE_RECURSION = YES; 388 | CLANG_WARN_INT_CONVERSION = YES; 389 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 390 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 391 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 392 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 393 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 394 | CLANG_WARN_STRICT_PROTOTYPES = YES; 395 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 396 | CLANG_WARN_UNREACHABLE_CODE = YES; 397 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 398 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 399 | COPY_PHASE_STRIP = NO; 400 | DEBUG_INFORMATION_FORMAT = dwarf; 401 | ENABLE_STRICT_OBJC_MSGSEND = YES; 402 | ENABLE_TESTABILITY = YES; 403 | GCC_C_LANGUAGE_STANDARD = gnu99; 404 | GCC_DYNAMIC_NO_PIC = NO; 405 | GCC_NO_COMMON_BLOCKS = YES; 406 | GCC_OPTIMIZATION_LEVEL = 0; 407 | GCC_PREPROCESSOR_DEFINITIONS = ( 408 | "DEBUG=1", 409 | "$(inherited)", 410 | ); 411 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 412 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 413 | GCC_WARN_UNDECLARED_SELECTOR = YES; 414 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 415 | GCC_WARN_UNUSED_FUNCTION = YES; 416 | GCC_WARN_UNUSED_VARIABLE = YES; 417 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 418 | MTL_ENABLE_DEBUG_INFO = YES; 419 | ONLY_ACTIVE_ARCH = YES; 420 | SDKROOT = iphoneos; 421 | TARGETED_DEVICE_FAMILY = "1,2"; 422 | }; 423 | name = Debug; 424 | }; 425 | 97C147041CF9000F007C117D /* Release */ = { 426 | isa = XCBuildConfiguration; 427 | buildSettings = { 428 | ALWAYS_SEARCH_USER_PATHS = NO; 429 | CLANG_ANALYZER_NONNULL = YES; 430 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 431 | CLANG_CXX_LIBRARY = "libc++"; 432 | CLANG_ENABLE_MODULES = YES; 433 | CLANG_ENABLE_OBJC_ARC = YES; 434 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 435 | CLANG_WARN_BOOL_CONVERSION = YES; 436 | CLANG_WARN_COMMA = YES; 437 | CLANG_WARN_CONSTANT_CONVERSION = YES; 438 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 439 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 440 | CLANG_WARN_EMPTY_BODY = YES; 441 | CLANG_WARN_ENUM_CONVERSION = YES; 442 | CLANG_WARN_INFINITE_RECURSION = YES; 443 | CLANG_WARN_INT_CONVERSION = YES; 444 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 445 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 446 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 447 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 448 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 449 | CLANG_WARN_STRICT_PROTOTYPES = YES; 450 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 451 | CLANG_WARN_UNREACHABLE_CODE = YES; 452 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 453 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 454 | COPY_PHASE_STRIP = NO; 455 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 456 | ENABLE_NS_ASSERTIONS = NO; 457 | ENABLE_STRICT_OBJC_MSGSEND = YES; 458 | GCC_C_LANGUAGE_STANDARD = gnu99; 459 | GCC_NO_COMMON_BLOCKS = YES; 460 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 461 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 462 | GCC_WARN_UNDECLARED_SELECTOR = YES; 463 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 464 | GCC_WARN_UNUSED_FUNCTION = YES; 465 | GCC_WARN_UNUSED_VARIABLE = YES; 466 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 467 | MTL_ENABLE_DEBUG_INFO = NO; 468 | SDKROOT = iphoneos; 469 | SUPPORTED_PLATFORMS = iphoneos; 470 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 471 | TARGETED_DEVICE_FAMILY = "1,2"; 472 | VALIDATE_PRODUCT = YES; 473 | }; 474 | name = Release; 475 | }; 476 | 97C147061CF9000F007C117D /* Debug */ = { 477 | isa = XCBuildConfiguration; 478 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 479 | buildSettings = { 480 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 481 | CLANG_ENABLE_MODULES = YES; 482 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 483 | ENABLE_BITCODE = NO; 484 | INFOPLIST_FILE = Runner/Info.plist; 485 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 486 | PRODUCT_BUNDLE_IDENTIFIER = com.example.starter; 487 | PRODUCT_NAME = "$(TARGET_NAME)"; 488 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 489 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 490 | SWIFT_VERSION = 5.0; 491 | VERSIONING_SYSTEM = "apple-generic"; 492 | }; 493 | name = Debug; 494 | }; 495 | 97C147071CF9000F007C117D /* Release */ = { 496 | isa = XCBuildConfiguration; 497 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 498 | buildSettings = { 499 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 500 | CLANG_ENABLE_MODULES = YES; 501 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 502 | ENABLE_BITCODE = NO; 503 | INFOPLIST_FILE = Runner/Info.plist; 504 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 505 | PRODUCT_BUNDLE_IDENTIFIER = com.example.starter; 506 | PRODUCT_NAME = "$(TARGET_NAME)"; 507 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 508 | SWIFT_VERSION = 5.0; 509 | VERSIONING_SYSTEM = "apple-generic"; 510 | }; 511 | name = Release; 512 | }; 513 | /* End XCBuildConfiguration section */ 514 | 515 | /* Begin XCConfigurationList section */ 516 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 517 | isa = XCConfigurationList; 518 | buildConfigurations = ( 519 | 97C147031CF9000F007C117D /* Debug */, 520 | 97C147041CF9000F007C117D /* Release */, 521 | 249021D3217E4FDB00AE95B9 /* Profile */, 522 | ); 523 | defaultConfigurationIsVisible = 0; 524 | defaultConfigurationName = Release; 525 | }; 526 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 527 | isa = XCConfigurationList; 528 | buildConfigurations = ( 529 | 97C147061CF9000F007C117D /* Debug */, 530 | 97C147071CF9000F007C117D /* Release */, 531 | 249021D4217E4FDB00AE95B9 /* Profile */, 532 | ); 533 | defaultConfigurationIsVisible = 0; 534 | defaultConfigurationName = Release; 535 | }; 536 | /* End XCConfigurationList section */ 537 | }; 538 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 539 | } 540 | -------------------------------------------------------------------------------- /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/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 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.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 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/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/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/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/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/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/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/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/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/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/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/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/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/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/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/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/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/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/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/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/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/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/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/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/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/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/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/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/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/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/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/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/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/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 | starter 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /lib/app/app.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | import 'package:starter/app/app_binding.dart'; 4 | import 'package:starter/app/data/values/constants.dart'; 5 | import 'package:starter/app/data/values/env.dart'; 6 | import 'package:starter/app/routes/app_pages.dart'; 7 | import 'package:starter/app/theme/app_theme.dart'; 8 | 9 | class App extends StatelessWidget { 10 | @override 11 | Widget build(BuildContext context) { 12 | return GetMaterialApp( 13 | title: Env.title, 14 | navigatorKey: GlobalKeys.navigationKey, 15 | debugShowCheckedModeBanner: false, 16 | theme: AppTheme.theme, 17 | initialRoute: Routes.SPLASH, 18 | getPages: AppPages.pages, 19 | defaultTransition: Transition.fade, 20 | initialBinding: AppBinding(), 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/app/app_binding.dart: -------------------------------------------------------------------------------- 1 | import 'package:get/get.dart'; 2 | import 'package:starter/app/app_controller.dart'; 3 | import 'package:starter/app/data/network/network_requester.dart'; 4 | import 'package:starter/app/data/repository/config_repository.dart'; 5 | import 'package:starter/app/data/repository/user_repository.dart'; 6 | 7 | class AppBinding extends Bindings { 8 | @override 9 | void dependencies() { 10 | Get.put(NetworkRequester(), permanent: true); 11 | Get.put(ConfigRepository(), permanent: true); 12 | Get.put(UserRepository(), permanent: true); 13 | Get.put(AppController(), permanent: true); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lib/app/app_controller.dart: -------------------------------------------------------------------------------- 1 | import 'package:starter/app/data/repository/config_repository.dart'; 2 | import 'package:starter/base/base_controller.dart'; 3 | 4 | class AppController extends BaseController { 5 | @override 6 | void onInit() { 7 | super.onInit(); 8 | repository.saveAppConfig(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/app/data/models/dto/response.dart: -------------------------------------------------------------------------------- 1 | import 'package:starter/utils/helper/exception_handler.dart'; 2 | 3 | class RepoResponse { 4 | final APIException? error; 5 | final T? data; 6 | 7 | RepoResponse({this.error, this.data}); 8 | } 9 | 10 | class DataWrapper { 11 | T? data; 12 | String? error; 13 | 14 | DataWrapper({this.error, this.data}); 15 | } 16 | -------------------------------------------------------------------------------- /lib/app/data/models/dto/user.dart: -------------------------------------------------------------------------------- 1 | class User { 2 | late String name; 3 | late String phone; 4 | late String email; 5 | late List address; 6 | late String jwtToken; 7 | 8 | User({ 9 | required this.name, 10 | required this.phone, 11 | required this.email, 12 | required this.address, 13 | required this.jwtToken, 14 | }); 15 | 16 | User.fromJson(Map json) { 17 | name = json['name']; 18 | phone = json['phone']; 19 | email = json['email']; 20 | address = json['address'].cast(); 21 | jwtToken = json['jwtToken']; 22 | } 23 | 24 | Map toJson() { 25 | final Map data = new Map(); 26 | data['name'] = this.name; 27 | data['phone'] = this.phone; 28 | data['email'] = this.email; 29 | data['address'] = this.address; 30 | data['jwtToken'] = this.jwtToken; 31 | return data; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/app/data/models/request/auth_request.dart: -------------------------------------------------------------------------------- 1 | class SendOTPRequest { 2 | late String phone; 3 | 4 | SendOTPRequest({required this.phone}); 5 | 6 | SendOTPRequest.fromJson(Map json) { 7 | this.phone = json['phone']; 8 | } 9 | 10 | Map toJson() { 11 | final Map data = Map(); 12 | data['phone'] = this.phone; 13 | return data; 14 | } 15 | } 16 | 17 | class VerifyOTPRequest { 18 | late String phone; 19 | late String otp; 20 | 21 | VerifyOTPRequest({required this.phone, required this.otp}); 22 | 23 | VerifyOTPRequest.fromJson(Map json) { 24 | this.phone = json['phone']; 25 | this.otp = json['otp']; 26 | } 27 | 28 | Map toJson() { 29 | final Map data = Map(); 30 | data['phone'] = this.phone; 31 | data['otp'] = this.otp; 32 | return data; 33 | } 34 | } 35 | 36 | class SignUpRequest { 37 | late String name; 38 | late String phone; 39 | late String email; 40 | 41 | SignUpRequest({ 42 | required this.name, 43 | required this.phone, 44 | required this.email, 45 | }); 46 | 47 | SignUpRequest.fromJson(Map json) { 48 | this.name = json['name']; 49 | this.phone = json['phone']; 50 | this.email = json['email']; 51 | } 52 | 53 | Map toJson() { 54 | final Map data = Map(); 55 | data['name'] = this.name; 56 | data['phone'] = this.phone; 57 | data['email'] = this.email; 58 | return data; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /lib/app/data/models/response/app_config_response.dart: -------------------------------------------------------------------------------- 1 | class AppConfigResponse { 2 | late AppConfig data; 3 | late int statusCode; 4 | 5 | AppConfigResponse({required this.data, required this.statusCode}); 6 | 7 | AppConfigResponse.fromJson(Map json) { 8 | this.data = AppConfig.fromJson(json['data']); 9 | this.statusCode = json['statusCode']; 10 | } 11 | 12 | Map toJson() { 13 | final Map data = Map(); 14 | data['data'] = this.data.toJson(); 15 | data['statusCode'] = this.statusCode; 16 | return data; 17 | } 18 | } 19 | 20 | class AppConfig { 21 | late String config; 22 | 23 | AppConfig({required this.config}); 24 | 25 | AppConfig.fromJson(Map json) { 26 | config = json['config']; 27 | } 28 | 29 | Map toJson() { 30 | final Map data = Map(); 31 | data['config'] = this.config; 32 | return data; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/app/data/models/response/error_response.dart: -------------------------------------------------------------------------------- 1 | class ErrorResponse { 2 | late String message; 3 | 4 | ErrorResponse({required this.message}); 5 | 6 | ErrorResponse.fromJson(Map? json) { 7 | message = json == null ? "" : json['message']; 8 | } 9 | 10 | Map toJson() { 11 | final Map data = Map(); 12 | data['message'] = this.message; 13 | return data; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lib/app/data/models/response/user_response.dart: -------------------------------------------------------------------------------- 1 | import 'package:starter/app/data/models/dto/user.dart'; 2 | 3 | class UserResponse { 4 | late User? data; 5 | late int statusCode; 6 | 7 | UserResponse({required this.data, required this.statusCode}); 8 | 9 | UserResponse.fromJson(Map json) { 10 | this.data = json['data'] == null ? null : User.fromJson(json['data']); 11 | this.statusCode = json['statusCode']; 12 | } 13 | 14 | Map toJson() { 15 | final Map data = Map(); 16 | data['data'] = this.data?.toJson(); 17 | data['statusCode'] = this.statusCode; 18 | return data; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lib/app/data/network/network_requester.dart: -------------------------------------------------------------------------------- 1 | import 'dart:developer'; 2 | 3 | import 'package:dio/dio.dart'; 4 | import 'package:starter/app/data/values/constants.dart'; 5 | import 'package:starter/app/data/values/env.dart'; 6 | import 'package:starter/utils/helper/exception_handler.dart'; 7 | 8 | class NetworkRequester { 9 | late Dio _dio; 10 | 11 | NetworkRequester() { 12 | prepareRequest(); 13 | } 14 | 15 | void prepareRequest() { 16 | BaseOptions dioOptions = BaseOptions( 17 | connectTimeout: Duration(milliseconds: Timeouts.CONNECT_TIMEOUT), 18 | receiveTimeout: Duration(milliseconds: Timeouts.RECEIVE_TIMEOUT), 19 | baseUrl: Env.baseURL, 20 | contentType: Headers.formUrlEncodedContentType, 21 | responseType: ResponseType.json, 22 | headers: {'Accept': Headers.jsonContentType}, 23 | ); 24 | 25 | _dio = Dio(dioOptions); 26 | 27 | _dio.interceptors.clear(); 28 | 29 | _dio.interceptors.add(LogInterceptor( 30 | error: true, 31 | request: true, 32 | requestBody: true, 33 | requestHeader: true, 34 | responseBody: true, 35 | responseHeader: true, 36 | logPrint: _printLog, 37 | )); 38 | } 39 | 40 | _printLog(Object object) => log(object.toString()); 41 | 42 | Future get({ 43 | required String path, 44 | Map? query, 45 | }) async { 46 | try { 47 | final response = await _dio.get(path, queryParameters: query); 48 | return response.data; 49 | } on Exception catch (exception) { 50 | return ExceptionHandler.handleError(exception); 51 | } 52 | } 53 | 54 | Future post({ 55 | required String path, 56 | Map? query, 57 | Map? data, 58 | }) async { 59 | try { 60 | final response = await _dio.post( 61 | path, 62 | queryParameters: query, 63 | data: data, 64 | ); 65 | return response.data; 66 | } on Exception catch (error) { 67 | return ExceptionHandler.handleError(error); 68 | } 69 | } 70 | 71 | Future put({ 72 | required String path, 73 | Map? query, 74 | Map? data, 75 | }) async { 76 | try { 77 | final response = await _dio.put(path, queryParameters: query, data: data); 78 | return response.data; 79 | } on Exception catch (error) { 80 | return ExceptionHandler.handleError(error); 81 | } 82 | } 83 | 84 | Future patch({ 85 | required String path, 86 | Map? query, 87 | Map? data, 88 | }) async { 89 | try { 90 | final response = 91 | await _dio.patch(path, queryParameters: query, data: data); 92 | return response.data; 93 | } on Exception catch (error) { 94 | return ExceptionHandler.handleError(error); 95 | } 96 | } 97 | 98 | Future delete({ 99 | required String path, 100 | Map? query, 101 | Map? data, 102 | }) async { 103 | try { 104 | final response = 105 | await _dio.delete(path, queryParameters: query, data: data); 106 | return response.data; 107 | } on Exception catch (error) { 108 | return ExceptionHandler.handleError(error); 109 | } 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /lib/app/data/repository/config_repository.dart: -------------------------------------------------------------------------------- 1 | import 'package:starter/app/data/models/response/app_config_response.dart'; 2 | import 'package:starter/app/data/values/urls.dart'; 3 | import 'package:starter/base/base_repository.dart'; 4 | import 'package:starter/utils/helper/exception_handler.dart'; 5 | import 'package:starter/utils/storage/storage_utils.dart'; 6 | 7 | class ConfigRepository extends BaseRepository { 8 | saveAppConfig() async { 9 | final response = await controller.get(path: URLs.appConfig); 10 | if (!(response is APIException)) 11 | Storage.setAppConfig(AppConfigResponse.fromJson(response).data); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/app/data/repository/user_repository.dart: -------------------------------------------------------------------------------- 1 | import 'package:starter/app/data/models/dto/response.dart'; 2 | import 'package:starter/app/data/models/dto/user.dart'; 3 | import 'package:starter/app/data/models/request/auth_request.dart'; 4 | import 'package:starter/app/data/models/response/user_response.dart'; 5 | import 'package:starter/app/data/values/urls.dart'; 6 | import 'package:starter/base/base_repository.dart'; 7 | import 'package:starter/utils/helper/exception_handler.dart'; 8 | 9 | class UserRepository extends BaseRepository { 10 | Future> sendOTP(SendOTPRequest data) async { 11 | final response = 12 | await controller.post(path: URLs.sendOTP, data: data.toJson()); 13 | 14 | return response is APIException 15 | ? RepoResponse(error: response) 16 | : RepoResponse(data: true); 17 | } 18 | 19 | Future> verifyOTP(VerifyOTPRequest data) async { 20 | final response = 21 | await controller.post(path: URLs.verifyOTP, data: data.toJson()); 22 | 23 | return response is APIException 24 | ? RepoResponse(error: response) 25 | : RepoResponse(data: UserResponse.fromJson(response).data); 26 | } 27 | 28 | Future> signUp(SignUpRequest data) async { 29 | final response = 30 | await controller.post(path: URLs.signUp, data: data.toJson()); 31 | 32 | return response is APIException 33 | ? RepoResponse(error: response) 34 | : RepoResponse(data: UserResponse.fromJson(response).data); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/app/data/values/constants.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class Timeouts { 4 | Timeouts._privateConstructor(); 5 | 6 | static const CONNECT_TIMEOUT = 10000; 7 | static const RECEIVE_TIMEOUT = 10000; 8 | } 9 | 10 | class GlobalKeys { 11 | GlobalKeys._privateConstructor(); 12 | 13 | static final navigationKey = GlobalKey(); 14 | } 15 | -------------------------------------------------------------------------------- /lib/app/data/values/env.dart: -------------------------------------------------------------------------------- 1 | class Env { 2 | Env._privateConstructor(); 3 | 4 | static const title = "Sample Project"; 5 | 6 | static const baseURL = "http://127.0.0.1:8080/"; 7 | } -------------------------------------------------------------------------------- /lib/app/data/values/images.dart: -------------------------------------------------------------------------------- 1 | class Images { 2 | Images._privateConstructor(); 3 | 4 | static const icAppLogo = 'assets/images/ic_app_logo.png'; 5 | } 6 | -------------------------------------------------------------------------------- /lib/app/data/values/strings.dart: -------------------------------------------------------------------------------- 1 | class Strings { 2 | Strings._privateConstructor(); 3 | 4 | static const appName = 'Sample App'; 5 | static const empty = ''; 6 | static const mobileNumber = 'Mobile Number'; 7 | static const getOTP = 'Get OTP'; 8 | static const retry = 'Retry'; 9 | } 10 | 11 | class ErrorMessages { 12 | ErrorMessages._privateConstructor(); 13 | 14 | static const unauthorized = 'You are not authorized'; 15 | static const noInternet = 'Please check your internet connection'; 16 | static const connectionTimeout = 'Please check your internet connection'; 17 | static const networkGeneral = 'Something went wrong. Please try again later.'; 18 | static const invalidPhone = 'Invalid Mobile number'; 19 | static const invalidOTP = 'Invalid OTP'; 20 | static const invalidName = 'Invalid Name'; 21 | static const invalidEmail = 'Invalid Email'; 22 | } 23 | -------------------------------------------------------------------------------- /lib/app/data/values/urls.dart: -------------------------------------------------------------------------------- 1 | class URLs { 2 | URLs._privateConstructor(); 3 | 4 | //Config APIs 5 | static const appConfig = "api/config"; 6 | 7 | //User APIs 8 | static const sendOTP = "api/auth/send-otp"; 9 | static const verifyOTP = "api/auth/verify-otp"; 10 | static const signUp = "/api/auth/signup"; 11 | } 12 | -------------------------------------------------------------------------------- /lib/app/modules/auth/login/bindings/auth_login_binding.dart: -------------------------------------------------------------------------------- 1 | import 'package:get/get.dart'; 2 | 3 | import '../controllers/auth_login_controller.dart'; 4 | 5 | class AuthLoginBinding extends Bindings { 6 | @override 7 | void dependencies() { 8 | Get.lazyPut( 9 | () => AuthLoginController(), 10 | ); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lib/app/modules/auth/login/controllers/auth_login_controller.dart: -------------------------------------------------------------------------------- 1 | import 'package:get/get.dart'; 2 | import 'package:starter/app/data/models/dto/response.dart'; 3 | import 'package:starter/app/data/models/request/auth_request.dart'; 4 | import 'package:starter/app/data/repository/user_repository.dart'; 5 | import 'package:starter/app/data/values/strings.dart'; 6 | import 'package:starter/app/routes/app_pages.dart'; 7 | import 'package:starter/base/base_controller.dart'; 8 | import 'package:starter/utils/helper/text_field_wrapper.dart'; 9 | import 'package:starter/utils/helper/validators.dart'; 10 | import 'package:starter/utils/loading/loading_utils.dart'; 11 | 12 | class AuthLoginController extends BaseController { 13 | final mobileWrapper = TextFieldWrapper(); 14 | 15 | sendOTP() async { 16 | String mobile = mobileWrapper.controller.text.trim(); 17 | if (mobile.isValidPhone()) { 18 | mobileWrapper.errorText = Strings.empty; 19 | } else { 20 | mobileWrapper.errorText = ErrorMessages.invalidPhone; 21 | return; 22 | } 23 | 24 | LoadingUtils.showLoader(); 25 | RepoResponse response = 26 | await repository.sendOTP(SendOTPRequest(phone: mobile)); 27 | LoadingUtils.hideLoader(); 28 | 29 | if (response.data ?? false) { 30 | Get.toNamed(Routes.AUTH_VERIFY_OTP, arguments: mobile); 31 | } else { 32 | mobileWrapper.errorText = response.error?.message ?? ""; 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lib/app/modules/auth/login/views/auth_login_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | import 'package:starter/app/data/values/strings.dart'; 4 | import 'package:starter/app/modules/auth/login/controllers/auth_login_controller.dart'; 5 | import 'package:starter/widgets/buttons/primary_filled_button.dart'; 6 | import 'package:starter/widgets/text_field/custom_text_field.dart'; 7 | 8 | class AuthLoginView extends GetView { 9 | @override 10 | Widget build(BuildContext context) { 11 | return Scaffold( 12 | body: SafeArea( 13 | child: SingleChildScrollView( 14 | child: Padding( 15 | padding: const EdgeInsets.all(24.0), 16 | child: Column( 17 | crossAxisAlignment: CrossAxisAlignment.stretch, 18 | mainAxisAlignment: MainAxisAlignment.start, 19 | children: [ 20 | CustomTextField( 21 | wrapper: controller.mobileWrapper, 22 | hintText: Strings.mobileNumber, 23 | maxLength: 10, 24 | inputType: TextInputType.number, 25 | ), 26 | SizedBox(height: 8.0), 27 | PrimaryFilledButton( 28 | text: Strings.getOTP, 29 | onTap: controller.sendOTP, 30 | ), 31 | ], 32 | ), 33 | ), 34 | ), 35 | ), 36 | ); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /lib/app/modules/auth/signup/bindings/auth_signup_binding.dart: -------------------------------------------------------------------------------- 1 | import 'package:get/get.dart'; 2 | 3 | import '../controllers/auth_signup_controller.dart'; 4 | 5 | class AuthSignupBinding extends Bindings { 6 | @override 7 | void dependencies() { 8 | Get.lazyPut( 9 | () => AuthSignupController(), 10 | ); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lib/app/modules/auth/signup/controllers/auth_signup_controller.dart: -------------------------------------------------------------------------------- 1 | import 'package:get/get.dart'; 2 | 3 | class AuthSignupController extends GetxController { 4 | //TODO: Implement AuthSignupController 5 | 6 | final count = 0.obs; 7 | @override 8 | void onInit() { 9 | super.onInit(); 10 | } 11 | 12 | @override 13 | void onReady() { 14 | super.onReady(); 15 | } 16 | 17 | @override 18 | void onClose() {} 19 | void increment() => count.value++; 20 | } 21 | -------------------------------------------------------------------------------- /lib/app/modules/auth/signup/views/auth_signup_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'package:get/get.dart'; 4 | 5 | import '../controllers/auth_signup_controller.dart'; 6 | 7 | class AuthSignupView extends GetView { 8 | @override 9 | Widget build(BuildContext context) { 10 | return Scaffold( 11 | appBar: AppBar( 12 | title: Text('AuthSignupView'), 13 | centerTitle: true, 14 | ), 15 | body: Center( 16 | child: Text( 17 | 'AuthSignupView is working', 18 | style: TextStyle(fontSize: 20), 19 | ), 20 | ), 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/app/modules/auth/verify-otp/bindings/auth_verify_otp_binding.dart: -------------------------------------------------------------------------------- 1 | import 'package:get/get.dart'; 2 | 3 | import '../controllers/auth_verify_otp_controller.dart'; 4 | 5 | class AuthVerifyOtpBinding extends Bindings { 6 | @override 7 | void dependencies() { 8 | Get.lazyPut( 9 | () => AuthVerifyOtpController(), 10 | ); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lib/app/modules/auth/verify-otp/controllers/auth_verify_otp_controller.dart: -------------------------------------------------------------------------------- 1 | import 'package:get/get.dart'; 2 | 3 | class AuthVerifyOtpController extends GetxController { 4 | //TODO: Implement AuthVerifyOtpController 5 | 6 | final count = 0.obs; 7 | @override 8 | void onInit() { 9 | super.onInit(); 10 | } 11 | 12 | @override 13 | void onReady() { 14 | super.onReady(); 15 | } 16 | 17 | @override 18 | void onClose() {} 19 | void increment() => count.value++; 20 | } 21 | -------------------------------------------------------------------------------- /lib/app/modules/auth/verify-otp/views/auth_verify_otp_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'package:get/get.dart'; 4 | 5 | import '../controllers/auth_verify_otp_controller.dart'; 6 | 7 | class AuthVerifyOtpView extends GetView { 8 | @override 9 | Widget build(BuildContext context) { 10 | return Scaffold( 11 | appBar: AppBar( 12 | title: Text('AuthVerifyOtpView'), 13 | centerTitle: true, 14 | ), 15 | body: Center( 16 | child: Text( 17 | 'AuthVerifyOtpView is working', 18 | style: TextStyle(fontSize: 20), 19 | ), 20 | ), 21 | ); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/app/modules/home/bindings/home_binding.dart: -------------------------------------------------------------------------------- 1 | import 'package:get/get.dart'; 2 | 3 | import '../controllers/home_controller.dart'; 4 | 5 | class HomeBinding extends Bindings { 6 | @override 7 | void dependencies() { 8 | Get.lazyPut(() => HomeController()); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/app/modules/home/controllers/home_controller.dart: -------------------------------------------------------------------------------- 1 | import 'package:get/get.dart'; 2 | 3 | class HomeController extends GetxController { 4 | final count = 0.obs; 5 | 6 | @override 7 | void onInit() { 8 | super.onInit(); 9 | } 10 | 11 | @override 12 | void onReady() { 13 | super.onReady(); 14 | } 15 | 16 | @override 17 | void onClose() {} 18 | 19 | void increment() => count.value++; 20 | } 21 | -------------------------------------------------------------------------------- /lib/app/modules/home/views/home_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | import '../controllers/home_controller.dart'; 5 | 6 | class HomeView extends GetView { 7 | @override 8 | Widget build(BuildContext context) { 9 | return Scaffold( 10 | appBar: AppBar( 11 | title: Text('HomeView'), 12 | centerTitle: true, 13 | ), 14 | body: Center( 15 | child: Text( 16 | 'HomeView is working', 17 | style: TextStyle(fontSize: 20), 18 | ), 19 | ), 20 | ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/app/modules/splash/bindings/splash_binding.dart: -------------------------------------------------------------------------------- 1 | import 'package:get/get.dart'; 2 | 3 | import '../controllers/splash_controller.dart'; 4 | 5 | class SplashBinding extends Bindings { 6 | @override 7 | void dependencies() { 8 | Get.put(SplashController()); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/app/modules/splash/controllers/splash_controller.dart: -------------------------------------------------------------------------------- 1 | import 'package:get/get.dart'; 2 | import 'package:starter/app/routes/app_pages.dart'; 3 | import 'package:starter/utils/storage/storage_utils.dart'; 4 | 5 | class SplashController extends GetxController { 6 | @override 7 | void onInit() { 8 | super.onInit(); 9 | _startOnboarding(); 10 | } 11 | 12 | _startOnboarding() async { 13 | await Future.delayed(Duration(seconds: 3)); 14 | 15 | if (Storage.isUserExists()) 16 | Get.offAllNamed(Routes.HOME); 17 | else 18 | Get.offAllNamed(Routes.AUTH_LOGIN); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /lib/app/modules/splash/views/splash_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | import '../controllers/splash_controller.dart'; 5 | 6 | class SplashView extends GetView { 7 | @override 8 | Widget build(BuildContext context) { 9 | return Scaffold( 10 | appBar: AppBar( 11 | title: Text('SplashView'), 12 | centerTitle: true, 13 | ), 14 | body: Center( 15 | child: Text( 16 | 'SplashView is working', 17 | style: TextStyle(fontSize: 20), 18 | ), 19 | ), 20 | ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/app/routes/app_pages.dart: -------------------------------------------------------------------------------- 1 | import 'package:get/get.dart'; 2 | import 'package:starter/app/modules/auth/login/bindings/auth_login_binding.dart'; 3 | import 'package:starter/app/modules/auth/login/views/auth_login_view.dart'; 4 | import 'package:starter/app/modules/auth/signup/bindings/auth_signup_binding.dart'; 5 | import 'package:starter/app/modules/auth/signup/views/auth_signup_view.dart'; 6 | import 'package:starter/app/modules/auth/verify-otp/bindings/auth_verify_otp_binding.dart'; 7 | import 'package:starter/app/modules/auth/verify-otp/views/auth_verify_otp_view.dart'; 8 | import 'package:starter/app/modules/home/bindings/home_binding.dart'; 9 | import 'package:starter/app/modules/home/views/home_view.dart'; 10 | import 'package:starter/app/modules/splash/bindings/splash_binding.dart'; 11 | import 'package:starter/app/modules/splash/views/splash_view.dart'; 12 | 13 | part 'app_routes.dart'; 14 | 15 | class AppPages { 16 | static final pages = [ 17 | GetPage( 18 | name: Routes.SPLASH, 19 | page: () => SplashView(), 20 | binding: SplashBinding(), 21 | ), 22 | GetPage( 23 | name: Routes.AUTH_LOGIN, 24 | page: () => AuthLoginView(), 25 | binding: AuthLoginBinding(), 26 | ), 27 | GetPage( 28 | name: Routes.AUTH_VERIFY_OTP, 29 | page: () => AuthVerifyOtpView(), 30 | binding: AuthVerifyOtpBinding(), 31 | ), 32 | GetPage( 33 | name: Routes.AUTH_SIGNUP, 34 | page: () => AuthSignupView(), 35 | binding: AuthSignupBinding(), 36 | ), 37 | GetPage( 38 | name: Routes.HOME, 39 | page: () => HomeView(), 40 | binding: HomeBinding(), 41 | ), 42 | ]; 43 | } 44 | -------------------------------------------------------------------------------- /lib/app/routes/app_routes.dart: -------------------------------------------------------------------------------- 1 | part of 'app_pages.dart'; 2 | 3 | abstract class Routes { 4 | static const SPLASH = '/splash'; 5 | static const AUTH_LOGIN = '/auth/login'; 6 | static const AUTH_VERIFY_OTP = '/auth/verify-otp'; 7 | static const AUTH_SIGNUP = '/auth/signup'; 8 | static const HOME = '/home'; 9 | } 10 | -------------------------------------------------------------------------------- /lib/app/theme/app_colors.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class AppColors { 4 | static const primaryColor = Color(0xFF000000); 5 | static const white = Color(0xFFFFFFFF); 6 | static final shimmerBaseColor = Colors.grey[200]!; 7 | static final shimmerHighlightColor = Colors.grey[350]!; 8 | } 9 | -------------------------------------------------------------------------------- /lib/app/theme/app_theme.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class AppTheme { 4 | static final theme = ThemeData( 5 | fontFamily: 'poppins', 6 | ); 7 | } 8 | -------------------------------------------------------------------------------- /lib/app/theme/styles.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'app_colors.dart'; 4 | 5 | class Styles { 6 | Styles._privateConstructor(); 7 | 8 | static const tsWhiteRegular18 = TextStyle( 9 | color: AppColors.white, 10 | fontWeight: FontWeight.w400, 11 | fontSize: 18.0, 12 | ); 13 | 14 | static const tsPrimaryColorRegular18 = TextStyle( 15 | color: AppColors.primaryColor, 16 | fontWeight: FontWeight.w400, 17 | fontSize: 18.0, 18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /lib/base/base_controller.dart: -------------------------------------------------------------------------------- 1 | import 'package:get/get.dart'; 2 | 3 | class BaseController extends GetxController { 4 | T get repository => GetInstance().find(); 5 | } 6 | -------------------------------------------------------------------------------- /lib/base/base_repository.dart: -------------------------------------------------------------------------------- 1 | import 'package:get/get.dart'; 2 | import 'package:starter/app/data/network/network_requester.dart'; 3 | 4 | class BaseRepository { 5 | NetworkRequester get controller => GetInstance().find(); 6 | } 7 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get_storage/get_storage.dart'; 3 | import 'package:starter/app/app.dart'; 4 | 5 | void main() async { 6 | await initGetStorage(); 7 | WidgetsFlutterBinding.ensureInitialized(); 8 | runApp(App()); 9 | } 10 | 11 | Future initGetStorage() async { 12 | await GetStorage.init(); 13 | } 14 | -------------------------------------------------------------------------------- /lib/utils/helper/exception_handler.dart: -------------------------------------------------------------------------------- 1 | import 'package:dio/dio.dart'; 2 | import 'package:get/get.dart'; 3 | import 'package:starter/app/data/models/response/error_response.dart'; 4 | import 'package:starter/app/data/values/strings.dart'; 5 | 6 | class APIException implements Exception { 7 | final String message; 8 | 9 | APIException({required this.message}); 10 | } 11 | 12 | class ExceptionHandler { 13 | ExceptionHandler._privateConstructor(); 14 | 15 | static APIException handleError(Exception error) { 16 | if (error is DioException) { 17 | switch (error.type) { 18 | case DioExceptionType.sendTimeout: 19 | return APIException(message: ErrorMessages.noInternet); 20 | case DioExceptionType.connectionTimeout: 21 | return APIException(message: ErrorMessages.connectionTimeout); 22 | case DioExceptionType.badResponse: 23 | return APIException( 24 | message: ErrorResponse.fromJson(error.response?.data).message); 25 | default: 26 | return APIException(message: ErrorMessages.networkGeneral); 27 | } 28 | } else { 29 | return APIException(message: ErrorMessages.networkGeneral); 30 | } 31 | } 32 | } 33 | 34 | class HandleError { 35 | HandleError._privateConstructor(); 36 | 37 | static handleError(APIException? error) { 38 | Get.rawSnackbar(message: error?.message ?? ErrorMessages.networkGeneral); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lib/utils/helper/text_field_wrapper.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | class TextFieldWrapper { 5 | final _controller = TextEditingController().obs; 6 | 7 | TextEditingController get controller => this._controller.value; 8 | 9 | set controller(TextEditingController value) => this._controller.value = value; 10 | 11 | final RxString _errorText = RxString(""); 12 | 13 | String get errorText => this._errorText.value; 14 | 15 | set errorText(String value) => this._errorText.value = value; 16 | 17 | TextFieldWrapper() { 18 | controller = TextEditingController(); 19 | } 20 | 21 | factory TextFieldWrapper.withValue({ 22 | TextEditingController? controller, 23 | String? errorText, 24 | }) { 25 | final wrap = TextFieldWrapper(); 26 | wrap.controller = controller ?? TextEditingController(); 27 | wrap.errorText = errorText ?? ""; 28 | return wrap; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lib/utils/helper/validators.dart: -------------------------------------------------------------------------------- 1 | extension TextValidators on String { 2 | bool isValidEmail() => RegExp(r"^[^\s@]+@[^\s@]+\.[^\s@]+$") 3 | .hasMatch(this.trim()); 4 | 5 | bool isValidPhone() => 6 | this.trim().isNotEmpty && int.parse(this.trim()).toString().length == 10; 7 | 8 | bool isValidOTP() => this.trim().length == 4; 9 | 10 | bool isValidName() => this.trim().isNotEmpty; 11 | } 12 | -------------------------------------------------------------------------------- /lib/utils/loading/loading_utils.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | 4 | class LoadingUtils { 5 | static var isLoaderShowing = false; 6 | 7 | static void showLoader() { 8 | if (!isLoaderShowing) { 9 | Get.dialog( 10 | WillPopScope( 11 | onWillPop: () { 12 | return Future.value(false); 13 | }, 14 | child: Center(child: CircularProgressIndicator()), 15 | ), 16 | barrierDismissible: false, 17 | ); 18 | isLoaderShowing = true; 19 | } 20 | } 21 | 22 | static void hideLoader() { 23 | if (isLoaderShowing) { 24 | Get.back(); 25 | isLoaderShowing = false; 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lib/utils/storage/storage_utils.dart: -------------------------------------------------------------------------------- 1 | import 'package:get_storage/get_storage.dart'; 2 | import 'package:starter/app/data/models/dto/user.dart'; 3 | import 'package:starter/app/data/models/response/app_config_response.dart'; 4 | 5 | class Storage { 6 | Storage._privateConstructor(); 7 | 8 | static final _box = GetStorage(); 9 | 10 | static AppConfig getAppConfig() => 11 | AppConfig.fromJson(_box.read(StorageKeys.APP_CONFIG)); 12 | 13 | static void setAppConfig(AppConfig appConfig) => 14 | _box.write(StorageKeys.APP_CONFIG, appConfig.toJson()); 15 | 16 | static User getUser() => User.fromJson(_box.read(StorageKeys.USER)); 17 | 18 | static void setUser(User? user) => 19 | _box.write(StorageKeys.USER, user?.toJson()); 20 | 21 | static bool isUserExists() => _box.read(StorageKeys.USER) != null; 22 | } 23 | 24 | class StorageKeys { 25 | StorageKeys._privateConstructor(); 26 | 27 | static const APP_CONFIG = 'app_config'; 28 | static const USER = 'user'; 29 | } 30 | -------------------------------------------------------------------------------- /lib/widgets/base/shimmer_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:shimmer/shimmer.dart'; 3 | import 'package:starter/app/data/models/dto/response.dart'; 4 | import 'package:starter/app/data/values/strings.dart'; 5 | import 'package:starter/app/theme/app_colors.dart'; 6 | import 'package:starter/app/theme/styles.dart'; 7 | import 'package:starter/widgets/buttons/primary_filled_button.dart'; 8 | 9 | class ShimmerWidget extends StatelessWidget { 10 | final Widget? error; 11 | final Widget shimmer; 12 | final VoidCallback? onRetry; 13 | final DataWrapper wrapper; 14 | final Widget Function(D data) child; 15 | 16 | const ShimmerWidget({ 17 | required this.child, 18 | required this.shimmer, 19 | required this.wrapper, 20 | this.error, 21 | this.onRetry, 22 | }); 23 | 24 | @override 25 | Widget build(BuildContext context) { 26 | if (wrapper.data != null) 27 | return child(wrapper.data!); 28 | else if (wrapper.error != null) 29 | return error ?? 30 | Container( 31 | width: double.infinity, 32 | padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 30), 33 | child: Column( 34 | mainAxisSize: MainAxisSize.min, 35 | children: [ 36 | Text(wrapper.error!, style: Styles.tsPrimaryColorRegular18), 37 | SizedBox(height: 16), 38 | PrimaryFilledButton( 39 | text: Strings.retry.toUpperCase(), 40 | onTap: onRetry ?? () {}, 41 | ), 42 | ], 43 | ), 44 | ); 45 | else 46 | return Shimmer.fromColors( 47 | child: shimmer, 48 | baseColor: AppColors.shimmerBaseColor, 49 | highlightColor: AppColors.shimmerHighlightColor, 50 | ); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /lib/widgets/buttons/primary_filled_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:starter/app/theme/app_colors.dart'; 3 | import 'package:starter/app/theme/styles.dart'; 4 | 5 | class PrimaryFilledButton extends StatelessWidget { 6 | final String text; 7 | final VoidCallback onTap; 8 | 9 | PrimaryFilledButton({required this.text, required this.onTap}); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return MaterialButton( 14 | onPressed: onTap, 15 | color: AppColors.primaryColor, 16 | child: Padding( 17 | padding: const EdgeInsets.all(20.0), 18 | child: Text( 19 | text, 20 | style: Styles.tsWhiteRegular18, 21 | ), 22 | ), 23 | shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15.0)), 24 | ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lib/widgets/text_field/custom_text_field.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | import 'package:starter/app/theme/app_colors.dart'; 4 | import 'package:starter/app/theme/styles.dart'; 5 | import 'package:starter/utils/helper/text_field_wrapper.dart'; 6 | 7 | class CustomTextField extends StatelessWidget { 8 | final String hintText; 9 | final int? maxLength; 10 | final TextInputType inputType; 11 | final TextFieldWrapper wrapper; 12 | final bool isEnabled; 13 | 14 | CustomTextField({ 15 | required this.wrapper, 16 | required this.hintText, 17 | this.maxLength, 18 | this.inputType = TextInputType.text, 19 | this.isEnabled = true, 20 | }); 21 | 22 | @override 23 | Widget build(BuildContext context) { 24 | return Obx( 25 | () => TextField( 26 | controller: wrapper.controller, 27 | style: Styles.tsPrimaryColorRegular18, 28 | maxLength: maxLength, 29 | keyboardType: inputType, 30 | enabled: isEnabled, 31 | decoration: InputDecoration( 32 | errorText: wrapper.errorText.isEmpty ? null : wrapper.errorText, 33 | errorStyle: Styles.tsPrimaryColorRegular18, 34 | counterText: '', 35 | fillColor: AppColors.white, 36 | filled: true, 37 | hintText: hintText, 38 | enabled: isEnabled, 39 | errorBorder: OutlineInputBorder( 40 | borderSide: BorderSide( 41 | color: AppColors.primaryColor, 42 | ), 43 | borderRadius: BorderRadius.circular(8.0), 44 | ), 45 | border: OutlineInputBorder( 46 | borderSide: BorderSide( 47 | color: AppColors.primaryColor, 48 | ), 49 | borderRadius: BorderRadius.circular(8.0), 50 | ), 51 | enabledBorder: OutlineInputBorder( 52 | borderSide: BorderSide( 53 | color: AppColors.primaryColor, 54 | ), 55 | borderRadius: BorderRadius.circular(8.0), 56 | ), 57 | disabledBorder: OutlineInputBorder( 58 | borderSide: BorderSide( 59 | color: AppColors.primaryColor, 60 | ), 61 | borderRadius: BorderRadius.circular(8.0), 62 | ), 63 | ), 64 | ), 65 | ); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: starter 2 | description: A new Flutter project. 3 | publish_to: "none" 4 | 5 | version: 1.0.0+1 6 | 7 | environment: 8 | sdk: ">=2.18.0 <4.0.0" 9 | 10 | dependencies: 11 | flutter: 12 | sdk: flutter 13 | 14 | # GetX 15 | get: ^4.6.6 16 | get_storage: ^2.1.1 17 | 18 | # Network 19 | dio: ^5.7.0 20 | 21 | # UI 22 | shimmer: ^3.0.0 23 | 24 | dev_dependencies: 25 | flutter_test: 26 | sdk: flutter 27 | 28 | flutter: 29 | uses-material-design: true 30 | 31 | fonts: 32 | - family: poppins 33 | fonts: 34 | - asset: assets/fonts/poppins_light.ttf 35 | weight: 300 36 | - asset: assets/fonts/poppins_light_italic.ttf 37 | weight: 300 38 | style: italic 39 | - asset: assets/fonts/poppins_regular.ttf 40 | weight: 400 41 | - asset: assets/fonts/poppins_italic.ttf 42 | weight: 400 43 | style: italic 44 | - asset: assets/fonts/poppins_medium.ttf 45 | weight: 500 46 | - asset: assets/fonts/poppins_medium_italic.ttf 47 | weight: 500 48 | style: italic 49 | - asset: assets/fonts/poppins_semi_bold.ttf 50 | weight: 600 51 | - asset: assets/fonts/poppins_semi_bold_italic.ttf 52 | weight: 600 53 | style: italic 54 | - asset: assets/fonts/poppins_bold.ttf 55 | weight: 700 56 | - asset: assets/fonts/poppins_bold_italic.ttf 57 | weight: 700 58 | style: italic 59 | - asset: assets/fonts/poppins_extra_bold.ttf 60 | weight: 800 61 | - asset: assets/fonts/poppins_bold_italic.ttf 62 | weight: 800 63 | style: italic 64 | -------------------------------------------------------------------------------- /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:starter/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(App()); 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 | -------------------------------------------------------------------------------- /web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/web/favicon.png -------------------------------------------------------------------------------- /web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/web/icons/Icon-192.png -------------------------------------------------------------------------------- /web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/A1H1/flutter-starter/3830b10f6f3dd4c2aeb1ddc02e78e9288c1de16b/web/icons/Icon-512.png -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | starter 30 | 31 | 32 | 33 | 36 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "starter", 3 | "short_name": "starter", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter project.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | } 22 | ] 23 | } 24 | --------------------------------------------------------------------------------