├── .gitignore ├── .metadata ├── README.md ├── android ├── .gitignore ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── am1ne │ │ │ │ └── task_app │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable │ │ │ └── launch_background.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets ├── fonts │ ├── Pacifico-Regular.ttf │ ├── Poppins-Medium.ttf │ └── Poppins-Regular.ttf └── images │ ├── icon_add.svg │ ├── icon_calendar.svg │ ├── icon_filter.svg │ ├── icon_home.svg │ ├── icon_next.svg │ ├── icon_notification.svg │ ├── icon_time.svg │ └── onboarding_img.svg ├── 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 ├── constant.dart ├── items │ └── task_item.dart ├── main.dart ├── models │ ├── task.dart │ ├── task.g.dart │ ├── user.dart │ ├── user.g.dart │ ├── user_task_detail.dart │ └── user_task_detail.g.dart ├── pages │ ├── home_screen.dart │ └── login_screen.dart ├── services │ ├── task_service.dart │ ├── user_service.dart │ └── user_task_detail_service.dart ├── size_config.dart ├── style.dart └── widgets │ └── ShowSnackBar.dart ├── pubspec.lock ├── pubspec.yaml └── test └── widget_test.dart /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | **/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 | -------------------------------------------------------------------------------- /.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: 1aafb3a8b9b0c36241c5f5b34ee914770f015818 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # task_app 2 | 3 | A new Flutter application. 4 | 5 | ## Configuration 6 | 7 | 1- go to project > and change constant.dart for the rest api url 8 | 9 | ### Getting Started 10 | 11 | This project is a starting point for a Flutter application. 12 | 13 | A few resources to get you started if this is your first Flutter project: 14 | 15 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) 16 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) 17 | 18 | For help getting started with Flutter, view our 19 | [online documentation](https://flutter.dev/docs), which offers tutorials, 20 | samples, guidance on mobile development, and a full API reference. 21 | 22 | ![](https://i.ibb.co/thMqvbg/task-app.png) 23 | -------------------------------------------------------------------------------- /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 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | compileSdkVersion 29 30 | 31 | sourceSets { 32 | main.java.srcDirs += 'src/main/kotlin' 33 | } 34 | 35 | lintOptions { 36 | disable 'InvalidPackage' 37 | } 38 | 39 | defaultConfig { 40 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 41 | applicationId "com.am1ne.task_app" 42 | minSdkVersion 16 43 | targetSdkVersion 29 44 | versionCode flutterVersionCode.toInteger() 45 | versionName flutterVersionName 46 | } 47 | 48 | buildTypes { 49 | release { 50 | // TODO: Add your own signing config for the release build. 51 | // Signing with the debug keys for now, so `flutter run --release` works. 52 | signingConfig signingConfigs.debug 53 | } 54 | } 55 | } 56 | 57 | flutter { 58 | source '../..' 59 | } 60 | 61 | dependencies { 62 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 63 | } 64 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 8 | 9 | 10 | 14 | 21 | 25 | 29 | 34 | 38 | 39 | 40 | 41 | 42 | 43 | 45 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/am1ne/task_app/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.am1ne.task_app 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /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/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /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 | buildscript { 2 | ext.kotlin_version = '1.3.50' 3 | repositories { 4 | google() 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:3.5.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | jcenter() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | android.enableR8=true 5 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip 7 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /assets/fonts/Pacifico-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/assets/fonts/Pacifico-Regular.ttf -------------------------------------------------------------------------------- /assets/fonts/Poppins-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/assets/fonts/Poppins-Medium.ttf -------------------------------------------------------------------------------- /assets/fonts/Poppins-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/assets/fonts/Poppins-Regular.ttf -------------------------------------------------------------------------------- /assets/images/icon_add.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/icon_calendar.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/icon_filter.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/icon_home.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/icon_next.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/icon_notification.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/icon_time.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/onboarding_img.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Onboarding illustration 2 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 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /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 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Flutter/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 | - FMDB (2.7.5): 4 | - FMDB/standard (= 2.7.5) 5 | - FMDB/standard (2.7.5) 6 | - path_provider (0.0.1): 7 | - Flutter 8 | - shared_preferences (0.0.1): 9 | - Flutter 10 | - sqflite (0.0.2): 11 | - Flutter 12 | - FMDB (>= 2.7.5) 13 | 14 | DEPENDENCIES: 15 | - Flutter (from `Flutter`) 16 | - path_provider (from `.symlinks/plugins/path_provider/ios`) 17 | - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) 18 | - sqflite (from `.symlinks/plugins/sqflite/ios`) 19 | 20 | SPEC REPOS: 21 | trunk: 22 | - FMDB 23 | 24 | EXTERNAL SOURCES: 25 | Flutter: 26 | :path: Flutter 27 | path_provider: 28 | :path: ".symlinks/plugins/path_provider/ios" 29 | shared_preferences: 30 | :path: ".symlinks/plugins/shared_preferences/ios" 31 | sqflite: 32 | :path: ".symlinks/plugins/sqflite/ios" 33 | 34 | SPEC CHECKSUMS: 35 | Flutter: 0e3d915762c693b495b44d77113d4970485de6ec 36 | FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a 37 | path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c 38 | shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d 39 | sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 40 | 41 | PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c 42 | 43 | COCOAPODS: 1.10.0 44 | -------------------------------------------------------------------------------- /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 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 16 | CC56C1A0A612226E0A7AC5C4 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 46C23A385C88E7D6399D89D0 /* Pods_Runner.framework */; }; 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 | 272172317D8F78C7AE8075DF /* 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 = ""; }; 36 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 37 | 46C23A385C88E7D6399D89D0 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 38 | 49601521100004AB2EA593DD /* 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 = ""; }; 39 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 40 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 41 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 42 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 43 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 44 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 46 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 47 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 48 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 49 | BC0C145D34FA9C139B0BD04D /* 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 = ""; }; 50 | /* End PBXFileReference section */ 51 | 52 | /* Begin PBXFrameworksBuildPhase section */ 53 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 54 | isa = PBXFrameworksBuildPhase; 55 | buildActionMask = 2147483647; 56 | files = ( 57 | CC56C1A0A612226E0A7AC5C4 /* Pods_Runner.framework in Frameworks */, 58 | ); 59 | runOnlyForDeploymentPostprocessing = 0; 60 | }; 61 | /* End PBXFrameworksBuildPhase section */ 62 | 63 | /* Begin PBXGroup section */ 64 | 636258B82949B361478AB773 /* Frameworks */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | 46C23A385C88E7D6399D89D0 /* Pods_Runner.framework */, 68 | ); 69 | name = Frameworks; 70 | sourceTree = ""; 71 | }; 72 | 77DBEE4FAB9B920EF991D17C /* Pods */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | 272172317D8F78C7AE8075DF /* Pods-Runner.debug.xcconfig */, 76 | 49601521100004AB2EA593DD /* Pods-Runner.release.xcconfig */, 77 | BC0C145D34FA9C139B0BD04D /* Pods-Runner.profile.xcconfig */, 78 | ); 79 | name = Pods; 80 | path = Pods; 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 | 77DBEE4FAB9B920EF991D17C /* Pods */, 101 | 636258B82949B361478AB773 /* 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 | 9AAE3589C9379FF27C4A64FB /* [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 | FE2B968BF887E8D5FBEF2CC2 /* [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 | 9740EEB61CF901F6004384FC /* Run Script */ = { 216 | isa = PBXShellScriptBuildPhase; 217 | buildActionMask = 2147483647; 218 | files = ( 219 | ); 220 | inputPaths = ( 221 | ); 222 | name = "Run Script"; 223 | outputPaths = ( 224 | ); 225 | runOnlyForDeploymentPostprocessing = 0; 226 | shellPath = /bin/sh; 227 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 228 | }; 229 | 9AAE3589C9379FF27C4A64FB /* [CP] Check Pods Manifest.lock */ = { 230 | isa = PBXShellScriptBuildPhase; 231 | buildActionMask = 2147483647; 232 | files = ( 233 | ); 234 | inputFileListPaths = ( 235 | ); 236 | inputPaths = ( 237 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 238 | "${PODS_ROOT}/Manifest.lock", 239 | ); 240 | name = "[CP] Check Pods Manifest.lock"; 241 | outputFileListPaths = ( 242 | ); 243 | outputPaths = ( 244 | "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", 245 | ); 246 | runOnlyForDeploymentPostprocessing = 0; 247 | shellPath = /bin/sh; 248 | 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"; 249 | showEnvVarsInLog = 0; 250 | }; 251 | FE2B968BF887E8D5FBEF2CC2 /* [CP] Embed Pods Frameworks */ = { 252 | isa = PBXShellScriptBuildPhase; 253 | buildActionMask = 2147483647; 254 | files = ( 255 | ); 256 | inputFileListPaths = ( 257 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", 258 | ); 259 | name = "[CP] Embed Pods Frameworks"; 260 | outputFileListPaths = ( 261 | "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", 262 | ); 263 | runOnlyForDeploymentPostprocessing = 0; 264 | shellPath = /bin/sh; 265 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\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 | FRAMEWORK_SEARCH_PATHS = ( 361 | "$(inherited)", 362 | "$(PROJECT_DIR)/Flutter", 363 | ); 364 | INFOPLIST_FILE = Runner/Info.plist; 365 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 366 | LIBRARY_SEARCH_PATHS = ( 367 | "$(inherited)", 368 | "$(PROJECT_DIR)/Flutter", 369 | ); 370 | PRODUCT_BUNDLE_IDENTIFIER = com.am1ne.taskApp; 371 | PRODUCT_NAME = "$(TARGET_NAME)"; 372 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 373 | SWIFT_VERSION = 5.0; 374 | VERSIONING_SYSTEM = "apple-generic"; 375 | }; 376 | name = Profile; 377 | }; 378 | 97C147031CF9000F007C117D /* Debug */ = { 379 | isa = XCBuildConfiguration; 380 | buildSettings = { 381 | ALWAYS_SEARCH_USER_PATHS = NO; 382 | CLANG_ANALYZER_NONNULL = YES; 383 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 384 | CLANG_CXX_LIBRARY = "libc++"; 385 | CLANG_ENABLE_MODULES = YES; 386 | CLANG_ENABLE_OBJC_ARC = YES; 387 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 388 | CLANG_WARN_BOOL_CONVERSION = YES; 389 | CLANG_WARN_COMMA = YES; 390 | CLANG_WARN_CONSTANT_CONVERSION = YES; 391 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 392 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 393 | CLANG_WARN_EMPTY_BODY = YES; 394 | CLANG_WARN_ENUM_CONVERSION = YES; 395 | CLANG_WARN_INFINITE_RECURSION = YES; 396 | CLANG_WARN_INT_CONVERSION = YES; 397 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 398 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 399 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 400 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 401 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 402 | CLANG_WARN_STRICT_PROTOTYPES = YES; 403 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 404 | CLANG_WARN_UNREACHABLE_CODE = YES; 405 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 406 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 407 | COPY_PHASE_STRIP = NO; 408 | DEBUG_INFORMATION_FORMAT = dwarf; 409 | ENABLE_STRICT_OBJC_MSGSEND = YES; 410 | ENABLE_TESTABILITY = YES; 411 | GCC_C_LANGUAGE_STANDARD = gnu99; 412 | GCC_DYNAMIC_NO_PIC = NO; 413 | GCC_NO_COMMON_BLOCKS = YES; 414 | GCC_OPTIMIZATION_LEVEL = 0; 415 | GCC_PREPROCESSOR_DEFINITIONS = ( 416 | "DEBUG=1", 417 | "$(inherited)", 418 | ); 419 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 420 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 421 | GCC_WARN_UNDECLARED_SELECTOR = YES; 422 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 423 | GCC_WARN_UNUSED_FUNCTION = YES; 424 | GCC_WARN_UNUSED_VARIABLE = YES; 425 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 426 | MTL_ENABLE_DEBUG_INFO = YES; 427 | ONLY_ACTIVE_ARCH = YES; 428 | SDKROOT = iphoneos; 429 | TARGETED_DEVICE_FAMILY = "1,2"; 430 | }; 431 | name = Debug; 432 | }; 433 | 97C147041CF9000F007C117D /* Release */ = { 434 | isa = XCBuildConfiguration; 435 | buildSettings = { 436 | ALWAYS_SEARCH_USER_PATHS = NO; 437 | CLANG_ANALYZER_NONNULL = YES; 438 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 439 | CLANG_CXX_LIBRARY = "libc++"; 440 | CLANG_ENABLE_MODULES = YES; 441 | CLANG_ENABLE_OBJC_ARC = YES; 442 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 443 | CLANG_WARN_BOOL_CONVERSION = YES; 444 | CLANG_WARN_COMMA = YES; 445 | CLANG_WARN_CONSTANT_CONVERSION = YES; 446 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 447 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 448 | CLANG_WARN_EMPTY_BODY = YES; 449 | CLANG_WARN_ENUM_CONVERSION = YES; 450 | CLANG_WARN_INFINITE_RECURSION = YES; 451 | CLANG_WARN_INT_CONVERSION = YES; 452 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 453 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 454 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 455 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 456 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 457 | CLANG_WARN_STRICT_PROTOTYPES = YES; 458 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 459 | CLANG_WARN_UNREACHABLE_CODE = YES; 460 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 461 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 462 | COPY_PHASE_STRIP = NO; 463 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 464 | ENABLE_NS_ASSERTIONS = NO; 465 | ENABLE_STRICT_OBJC_MSGSEND = YES; 466 | GCC_C_LANGUAGE_STANDARD = gnu99; 467 | GCC_NO_COMMON_BLOCKS = YES; 468 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 469 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 470 | GCC_WARN_UNDECLARED_SELECTOR = YES; 471 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 472 | GCC_WARN_UNUSED_FUNCTION = YES; 473 | GCC_WARN_UNUSED_VARIABLE = YES; 474 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 475 | MTL_ENABLE_DEBUG_INFO = NO; 476 | SDKROOT = iphoneos; 477 | SUPPORTED_PLATFORMS = iphoneos; 478 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 479 | TARGETED_DEVICE_FAMILY = "1,2"; 480 | VALIDATE_PRODUCT = YES; 481 | }; 482 | name = Release; 483 | }; 484 | 97C147061CF9000F007C117D /* Debug */ = { 485 | isa = XCBuildConfiguration; 486 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 487 | buildSettings = { 488 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 489 | CLANG_ENABLE_MODULES = YES; 490 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 491 | ENABLE_BITCODE = NO; 492 | FRAMEWORK_SEARCH_PATHS = ( 493 | "$(inherited)", 494 | "$(PROJECT_DIR)/Flutter", 495 | ); 496 | INFOPLIST_FILE = Runner/Info.plist; 497 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 498 | LIBRARY_SEARCH_PATHS = ( 499 | "$(inherited)", 500 | "$(PROJECT_DIR)/Flutter", 501 | ); 502 | PRODUCT_BUNDLE_IDENTIFIER = com.am1ne.taskApp; 503 | PRODUCT_NAME = "$(TARGET_NAME)"; 504 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 505 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 506 | SWIFT_VERSION = 5.0; 507 | VERSIONING_SYSTEM = "apple-generic"; 508 | }; 509 | name = Debug; 510 | }; 511 | 97C147071CF9000F007C117D /* Release */ = { 512 | isa = XCBuildConfiguration; 513 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 514 | buildSettings = { 515 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 516 | CLANG_ENABLE_MODULES = YES; 517 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 518 | ENABLE_BITCODE = NO; 519 | FRAMEWORK_SEARCH_PATHS = ( 520 | "$(inherited)", 521 | "$(PROJECT_DIR)/Flutter", 522 | ); 523 | INFOPLIST_FILE = Runner/Info.plist; 524 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 525 | LIBRARY_SEARCH_PATHS = ( 526 | "$(inherited)", 527 | "$(PROJECT_DIR)/Flutter", 528 | ); 529 | PRODUCT_BUNDLE_IDENTIFIER = com.am1ne.taskApp; 530 | PRODUCT_NAME = "$(TARGET_NAME)"; 531 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 532 | SWIFT_VERSION = 5.0; 533 | VERSIONING_SYSTEM = "apple-generic"; 534 | }; 535 | name = Release; 536 | }; 537 | /* End XCBuildConfiguration section */ 538 | 539 | /* Begin XCConfigurationList section */ 540 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 541 | isa = XCConfigurationList; 542 | buildConfigurations = ( 543 | 97C147031CF9000F007C117D /* Debug */, 544 | 97C147041CF9000F007C117D /* Release */, 545 | 249021D3217E4FDB00AE95B9 /* Profile */, 546 | ); 547 | defaultConfigurationIsVisible = 0; 548 | defaultConfigurationName = Release; 549 | }; 550 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 551 | isa = XCConfigurationList; 552 | buildConfigurations = ( 553 | 97C147061CF9000F007C117D /* Debug */, 554 | 97C147071CF9000F007C117D /* Release */, 555 | 249021D4217E4FDB00AE95B9 /* Profile */, 556 | ); 557 | defaultConfigurationIsVisible = 0; 558 | defaultConfigurationName = Release; 559 | }; 560 | /* End XCConfigurationList section */ 561 | }; 562 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 563 | } 564 | -------------------------------------------------------------------------------- /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/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/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/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/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/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/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/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/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/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/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/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/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/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/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/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/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/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/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/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/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/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/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/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/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/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/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/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/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/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/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/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AmineLAHRIM/flutter_task_app/06c3f79e3cd7d45dcc0eda43555111f87a206380/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 | task_app 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/constant.dart: -------------------------------------------------------------------------------- 1 | class Constant{ 2 | static final String REST_URL='http://192.168.1.104:8090/taskapp'; 3 | } -------------------------------------------------------------------------------- /lib/items/task_item.dart: -------------------------------------------------------------------------------- 1 | import 'package:align_positioned/align_positioned.dart'; 2 | import 'package:cached_network_image/cached_network_image.dart'; 3 | import 'package:eva_icons_flutter/eva_icons_flutter.dart'; 4 | import 'package:flutter/foundation.dart'; 5 | import 'package:flutter/material.dart'; 6 | import 'package:intl/intl.dart'; 7 | import 'package:task_app/models/task.dart'; 8 | import 'package:task_app/models/user.dart'; 9 | import 'package:task_app/services/user_task_detail_service.dart'; 10 | import 'package:task_app/style.dart'; 11 | 12 | class TaskItem extends StatefulWidget { 13 | TaskItem({ 14 | Key key, 15 | @required this.currentTask, 16 | @required this.userTaskDetailService, 17 | }) : super(key: key); 18 | 19 | final Task currentTask; 20 | final UserTaskDetailService userTaskDetailService; 21 | 22 | @override 23 | _TaskItemState createState() => _TaskItemState(); 24 | } 25 | 26 | class _TaskItemState extends State { 27 | List users = []; 28 | 29 | @override 30 | void initState() { 31 | // TODO: implement initState 32 | super.initState(); 33 | setupUsers(); 34 | } 35 | 36 | @override 37 | Widget build(BuildContext context) { 38 | return Container( 39 | margin: EdgeInsets.only(right: 16, top: 8, bottom: 16), 40 | child: AspectRatio( 41 | aspectRatio: 1.6/1, 42 | child: Stack( 43 | children: [ 44 | Card( 45 | clipBehavior: Clip.antiAlias, 46 | elevation: 2, 47 | shadowColor: AppTheme.shadow, 48 | margin: EdgeInsets.zero, 49 | shape: RoundedRectangleBorder( 50 | borderRadius: BorderRadius.circular(AppTheme.radius)), 51 | child: Stack( 52 | children: [ 53 | Container( 54 | margin: EdgeInsets.symmetric(vertical: 16, horizontal: 0), 55 | child: Column( 56 | children: [ 57 | Flexible( 58 | flex: 20, 59 | child: Container( 60 | margin: EdgeInsets.symmetric( 61 | vertical: 0, horizontal: 16), 62 | child: Row( 63 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 64 | children: [ 65 | Flexible( 66 | flex: 80, 67 | child: FittedBox( 68 | child: Text( 69 | widget.currentTask.name, 70 | style: 71 | Theme.of(context).textTheme.headline2, 72 | ), 73 | ), 74 | ), 75 | Flexible( 76 | flex: 20, 77 | child: Icon( 78 | EvaIcons.moreHorizotnal, 79 | color: AppTheme.subTitleTextColor, 80 | ), 81 | ), 82 | ], 83 | ), 84 | ), 85 | ), 86 | Expanded( 87 | flex: 50, 88 | child: Container( 89 | margin: EdgeInsets.symmetric( 90 | vertical: 0, horizontal: 16), 91 | child: FractionallySizedBox( 92 | heightFactor: 0.6, 93 | child: ListView.builder( 94 | scrollDirection: Axis.horizontal, 95 | itemCount: users.length, 96 | itemBuilder: (context, index) { 97 | var currentUser = users[index]; 98 | return Container( 99 | height: double.infinity, 100 | margin: EdgeInsets.only( 101 | right: 8), 102 | child: AspectRatio( 103 | aspectRatio: 1 / 1, 104 | child: Card( 105 | elevation: 0, 106 | margin: EdgeInsets.zero, 107 | clipBehavior: Clip.antiAlias, 108 | shape: RoundedRectangleBorder( 109 | borderRadius: BorderRadius.circular( 110 | AppTheme.radius)), 111 | child: Container( 112 | width: double.infinity, 113 | height: double.infinity, 114 | child: CachedNetworkImage( 115 | imageUrl: currentUser.imageUrl, 116 | fit: BoxFit.cover, 117 | ), 118 | ), 119 | ), 120 | ), 121 | ); 122 | }, 123 | ), 124 | ), 125 | ), 126 | ), 127 | Container( 128 | child: Divider( 129 | color: AppTheme.shadow, 130 | thickness: 1, 131 | ), 132 | ), 133 | Expanded( 134 | flex: 30, 135 | child: Container( 136 | alignment: Alignment.bottomCenter, 137 | margin: 138 | EdgeInsets.only(left: 16, right: 16), 139 | child: FractionallySizedBox( 140 | heightFactor: 0.65, 141 | child: Row( 142 | children: [ 143 | Expanded( 144 | flex: 40, 145 | child: Card( 146 | margin: EdgeInsets.zero, 147 | elevation: 0, 148 | color: widget.currentTask.status == null 149 | ? AppTheme.primary 150 | : AppTheme.taskStatusColors[ 151 | widget.currentTask.status.index], 152 | clipBehavior: Clip.antiAlias, 153 | shape: RoundedRectangleBorder( 154 | borderRadius: BorderRadius.circular( 155 | AppTheme.radius)), 156 | child: Container( 157 | width: double.infinity, 158 | height: double.infinity, 159 | alignment: Alignment.center, 160 | child: FittedBox( 161 | fit: BoxFit.scaleDown, 162 | child: Text( 163 | widget.currentTask.status == null 164 | ? 'Task' 165 | : describeEnum( 166 | widget.currentTask.status), 167 | style: Theme.of(context) 168 | .textTheme 169 | .headline5 170 | .copyWith(color: Colors.white), 171 | ), 172 | )), 173 | ), 174 | ), 175 | Spacer( 176 | flex: 20, 177 | ), 178 | Expanded( 179 | flex: 40, 180 | child: Container( 181 | width: double.infinity, 182 | child: FractionallySizedBox( 183 | heightFactor: 0.8, 184 | child: Row( 185 | mainAxisAlignment: 186 | MainAxisAlignment.end, 187 | children: [ 188 | Flexible( 189 | child: Container( 190 | margin: EdgeInsets.only( 191 | right: 8), 192 | child: FittedBox( 193 | child: Icon( 194 | EvaIcons.clock)))), 195 | Flexible( 196 | child: Container( 197 | child: FittedBox( 198 | child: Text( 199 | DateFormat.d().format(widget 200 | .currentTask.date) + 201 | ' - ' + 202 | DateFormat.Hm().format( 203 | widget.currentTask 204 | .date), 205 | style: Theme.of(context) 206 | .textTheme 207 | .headline5, 208 | maxLines: 1, 209 | ), 210 | ), 211 | ), 212 | ), 213 | ], 214 | ), 215 | ), 216 | ), 217 | ), 218 | ], 219 | ), 220 | ), 221 | )) 222 | ], 223 | )), 224 | Positioned.fill( 225 | child: Material( 226 | color: Colors.transparent, 227 | child: InkWell( 228 | splashFactory: InkRipple.splashFactory, 229 | splashColor: AppTheme.shadow.withOpacity(0.1), 230 | onTap: () => null, 231 | ), 232 | ), 233 | ), 234 | ], 235 | ), 236 | ), 237 | Container( 238 | width: 5, 239 | alignment: Alignment.centerLeft, 240 | child: FractionallySizedBox( 241 | heightFactor: 0.7, 242 | widthFactor: 1, 243 | child: AlignPositioned( 244 | moveByContainerWidth: -0.5, 245 | touch: Touch.inside, 246 | child: Card( 247 | margin: EdgeInsets.zero, 248 | elevation: 0, 249 | shape: RoundedRectangleBorder( 250 | borderRadius: BorderRadius.circular(100)), 251 | color: widget.currentTask.status == null 252 | ? AppTheme.primary 253 | : AppTheme 254 | .taskStatusColors[widget.currentTask.status.index], 255 | child: Container( 256 | width: double.infinity, 257 | height: double.infinity, 258 | ), 259 | ), 260 | ), 261 | ), 262 | ), 263 | ], 264 | ), 265 | ), 266 | ); 267 | } 268 | 269 | void setupUsers() { 270 | widget.userTaskDetailService 271 | .findAllByTask_Id(widget.currentTask.id) 272 | .then((value) { 273 | if (value != null && value.length > 0) { 274 | setState(() { 275 | if (value.length > 5) { 276 | users = value.sublist(0, 5); 277 | } else { 278 | users = value; 279 | } 280 | }); 281 | } 282 | }); 283 | } 284 | } 285 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter/services.dart'; 3 | import 'package:provider/provider.dart'; 4 | import 'package:shared_preferences/shared_preferences.dart'; 5 | import 'package:task_app/pages/home_screen.dart'; 6 | import 'package:task_app/pages/login_screen.dart'; 7 | import 'package:task_app/services/task_service.dart'; 8 | import 'package:task_app/services/user_service.dart'; 9 | import 'package:task_app/services/user_task_detail_service.dart'; 10 | import 'package:task_app/size_config.dart'; 11 | import 'package:task_app/style.dart'; 12 | 13 | void main() { 14 | runApp(MyApp()); 15 | } 16 | 17 | class MyApp extends StatelessWidget { 18 | // This widget is the root of your application. 19 | @override 20 | Widget build(BuildContext context) { 21 | SystemChrome.setSystemUIOverlayStyle(AppTheme.systemUiTrans); 22 | // this will prevent change oriontation 23 | SystemChrome.setPreferredOrientations([ 24 | DeviceOrientation.portraitUp, 25 | DeviceOrientation.portraitDown, 26 | ]); 27 | 28 | return LayoutBuilder( 29 | builder: (context, constraints) { 30 | return OrientationBuilder( 31 | builder: (context, orientation) { 32 | SizeConfig().init(constraints, orientation); 33 | return MultiProvider( 34 | providers: [ 35 | ChangeNotifierProvider( 36 | create: (context) => UserService(), 37 | ), 38 | ChangeNotifierProvider( 39 | create: (context) => TaskService(), 40 | ), 41 | ChangeNotifierProvider( 42 | create: (context) => UserTaskDetailService(), 43 | ), 44 | ], 45 | child: MaterialApp( 46 | theme: AppTheme.lightTheme, 47 | debugShowCheckedModeBanner: false, 48 | home: Home(), 49 | routes: { 50 | LoginScreen.routeName: (ctx) => LoginScreen(), 51 | HomeScreen.routeName: (ctx) => HomeScreen(), 52 | }, 53 | ), 54 | ); 55 | }, 56 | ); 57 | }, 58 | ); 59 | } 60 | } 61 | 62 | class Home extends StatefulWidget { 63 | const Home({ 64 | Key key, 65 | }) : super(key: key); 66 | 67 | @override 68 | _HomeState createState() => _HomeState(); 69 | } 70 | 71 | class _HomeState extends State { 72 | bool isLoadingInfo = false; 73 | bool isInit = false; 74 | 75 | //Widget screen = LoginScreen(); 76 | 77 | @override 78 | void initState() { 79 | // TODO: implement initState 80 | super.initState(); 81 | } 82 | 83 | @override 84 | void didChangeDependencies() { 85 | // TODO: implement didChangeDependencies 86 | super.didChangeDependencies(); 87 | if (!isInit) { 88 | verifyAuth(); 89 | } 90 | isInit = true; 91 | } 92 | 93 | @override 94 | Widget build(BuildContext context) { 95 | return !isLoadingInfo 96 | ? Container( 97 | color: Colors.white, 98 | ) 99 | : LoginScreen(); 100 | } 101 | 102 | Future verifyAuth() async { 103 | SharedPreferences prefs = await SharedPreferences.getInstance(); 104 | if (prefs.containsKey('userId')) { 105 | int userId = prefs.getInt('userId'); 106 | if (userId > 0) { 107 | Navigator.pushReplacementNamed(context, HomeScreen.routeName, arguments: userId); 108 | }else{ 109 | setState(() { 110 | isLoadingInfo = true; 111 | }); 112 | } 113 | } else { 114 | setState(() { 115 | isLoadingInfo = true; 116 | }); 117 | } 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /lib/models/task.dart: -------------------------------------------------------------------------------- 1 | import 'package:json_annotation/json_annotation.dart'; 2 | import 'package:task_app/models/user.dart'; 3 | import 'package:task_app/models/user_task_detail.dart'; 4 | 5 | part 'task.g.dart'; 6 | 7 | enum TaskStatus { 8 | Task, 9 | Doing, 10 | Done, 11 | Important, 12 | } 13 | 14 | @JsonSerializable(explicitToJson: true) 15 | class Task { 16 | int id; 17 | String name; 18 | DateTime date; 19 | String imageUrl; 20 | String description; 21 | TaskStatus status; 22 | bool deleted; 23 | 24 | List userTaskDetail; 25 | List users; 26 | 27 | Task( 28 | {this.id, 29 | this.name, 30 | this.date, 31 | this.imageUrl, 32 | this.description, 33 | this.status, 34 | this.deleted, 35 | this.userTaskDetail, 36 | this.users}); 37 | 38 | factory Task.fromJson(Map json) => _$TaskFromJson(json); 39 | 40 | Map toJson() => _$TaskToJson(this); 41 | } 42 | -------------------------------------------------------------------------------- /lib/models/task.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'task.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | Task _$TaskFromJson(Map json) { 10 | return Task( 11 | id: json['id'] as int, 12 | name: json['name'] as String, 13 | date: json['date'] == null ? null : DateTime.parse(json['date'] as String), 14 | imageUrl: json['imageUrl'] as String, 15 | description: json['description'] as String, 16 | status: _$enumDecodeNullable(_$TaskStatusEnumMap, json['status']), 17 | deleted: json['deleted'] as bool, 18 | userTaskDetail: (json['userTaskDetail'] as List) 19 | ?.map((e) => e == null 20 | ? null 21 | : UserTaskDetail.fromJson(e as Map)) 22 | ?.toList(), 23 | users: (json['users'] as List) 24 | ?.map( 25 | (e) => e == null ? null : User.fromJson(e as Map)) 26 | ?.toList(), 27 | ); 28 | } 29 | 30 | Map _$TaskToJson(Task instance) => { 31 | 'id': instance.id, 32 | 'name': instance.name, 33 | 'date': instance.date?.toIso8601String(), 34 | 'imageUrl': instance.imageUrl, 35 | 'description': instance.description, 36 | 'status': _$TaskStatusEnumMap[instance.status], 37 | 'deleted': instance.deleted, 38 | 'userTaskDetail': 39 | instance.userTaskDetail?.map((e) => e?.toJson())?.toList(), 40 | 'users': instance.users?.map((e) => e?.toJson())?.toList(), 41 | }; 42 | 43 | T _$enumDecode( 44 | Map enumValues, 45 | dynamic source, { 46 | T unknownValue, 47 | }) { 48 | if (source == null) { 49 | throw ArgumentError('A value must be provided. Supported values: ' 50 | '${enumValues.values.join(', ')}'); 51 | } 52 | 53 | final value = enumValues.entries 54 | .singleWhere((e) => e.value == source, orElse: () => null) 55 | ?.key; 56 | 57 | if (value == null && unknownValue == null) { 58 | throw ArgumentError('`$source` is not one of the supported values: ' 59 | '${enumValues.values.join(', ')}'); 60 | } 61 | return value ?? unknownValue; 62 | } 63 | 64 | T _$enumDecodeNullable( 65 | Map enumValues, 66 | dynamic source, { 67 | T unknownValue, 68 | }) { 69 | if (source == null) { 70 | return null; 71 | } 72 | return _$enumDecode(enumValues, source, unknownValue: unknownValue); 73 | } 74 | 75 | const _$TaskStatusEnumMap = { 76 | TaskStatus.Task: 'Task', 77 | TaskStatus.Doing: 'Doing', 78 | TaskStatus.Done: 'Done', 79 | TaskStatus.Important: 'Important', 80 | }; 81 | -------------------------------------------------------------------------------- /lib/models/user.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:json_annotation/json_annotation.dart'; 3 | 4 | part 'user.g.dart'; 5 | 6 | @JsonSerializable() 7 | class User{ 8 | int id; 9 | String name; 10 | String imageUrl; 11 | String email; 12 | String password; 13 | String geoLocalisation; 14 | bool deleted; 15 | 16 | 17 | User({this.id, this.name, this.imageUrl, this.email, this.password, 18 | this.geoLocalisation, this.deleted}); 19 | 20 | factory User.fromJson(Map json) => _$UserFromJson(json); 21 | 22 | Map toJson() => _$UserToJson(this); 23 | 24 | } -------------------------------------------------------------------------------- /lib/models/user.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'user.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | User _$UserFromJson(Map json) { 10 | return User( 11 | id: json['id'] as int, 12 | name: json['name'] as String, 13 | imageUrl: json['imageUrl'] as String, 14 | email: json['email'] as String, 15 | password: json['password'] as String, 16 | geoLocalisation: json['geoLocalisation'] as String, 17 | deleted: json['deleted'] as bool, 18 | ); 19 | } 20 | 21 | Map _$UserToJson(User instance) => { 22 | 'id': instance.id, 23 | 'name': instance.name, 24 | 'imageUrl': instance.imageUrl, 25 | 'email': instance.email, 26 | 'password': instance.password, 27 | 'geoLocalisation': instance.geoLocalisation, 28 | 'deleted': instance.deleted, 29 | }; 30 | -------------------------------------------------------------------------------- /lib/models/user_task_detail.dart: -------------------------------------------------------------------------------- 1 | import 'package:json_annotation/json_annotation.dart'; 2 | import 'package:task_app/models/task.dart'; 3 | import 'package:task_app/models/user.dart'; 4 | 5 | part 'user_task_detail.g.dart'; 6 | 7 | 8 | @JsonSerializable(explicitToJson: true) 9 | class UserTaskDetail { 10 | int id; 11 | List users; 12 | List tasks; 13 | 14 | 15 | UserTaskDetail({this.id, this.users, this.tasks}); 16 | 17 | factory UserTaskDetail.fromJson(Map json) => _$UserTaskDetailFromJson(json); 18 | 19 | Map toJson() => _$UserTaskDetailToJson(this); 20 | } 21 | -------------------------------------------------------------------------------- /lib/models/user_task_detail.g.dart: -------------------------------------------------------------------------------- 1 | // GENERATED CODE - DO NOT MODIFY BY HAND 2 | 3 | part of 'user_task_detail.dart'; 4 | 5 | // ************************************************************************** 6 | // JsonSerializableGenerator 7 | // ************************************************************************** 8 | 9 | UserTaskDetail _$UserTaskDetailFromJson(Map json) { 10 | return UserTaskDetail( 11 | id: json['id'] as int, 12 | users: (json['users'] as List) 13 | ?.map( 14 | (e) => e == null ? null : User.fromJson(e as Map)) 15 | ?.toList(), 16 | tasks: (json['tasks'] as List) 17 | ?.map( 18 | (e) => e == null ? null : Task.fromJson(e as Map)) 19 | ?.toList(), 20 | ); 21 | } 22 | 23 | Map _$UserTaskDetailToJson(UserTaskDetail instance) => 24 | { 25 | 'id': instance.id, 26 | 'users': instance.users?.map((e) => e?.toJson())?.toList(), 27 | 'tasks': instance.tasks?.map((e) => e?.toJson())?.toList(), 28 | }; 29 | -------------------------------------------------------------------------------- /lib/pages/home_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:eva_icons_flutter/eva_icons_flutter.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter/services.dart'; 4 | import 'package:flutter_svg/flutter_svg.dart'; 5 | import 'package:provider/provider.dart'; 6 | import 'package:task_app/items/task_item.dart'; 7 | import 'package:task_app/models/task.dart'; 8 | import 'package:task_app/models/user.dart'; 9 | import 'package:task_app/services/task_service.dart'; 10 | import 'package:task_app/services/user_service.dart'; 11 | import 'package:task_app/services/user_task_detail_service.dart'; 12 | import 'package:task_app/style.dart'; 13 | 14 | class HomeScreen extends StatefulWidget { 15 | static var routeName = '/home'; 16 | 17 | 18 | @override 19 | _HomeScreenState createState() => _HomeScreenState(); 20 | } 21 | 22 | class _HomeScreenState extends State { 23 | TaskService taskService; 24 | UserService userService; 25 | bool isInit = false; 26 | bool isLoading = true; 27 | List tasks = []; 28 | List tomorrowTasks = []; 29 | List importantTasks = []; 30 | User currentUser; 31 | 32 | @override 33 | void didChangeDependencies() { 34 | // TODO: implement didChangeDependencies 35 | super.didChangeDependencies(); 36 | if (!isInit) { 37 | taskService = Provider.of(context); 38 | userService = Provider.of(context); 39 | var args = ModalRoute.of(context).settings.arguments; 40 | if (args != null) { 41 | int userId = args; 42 | if (userId > 0) { 43 | userService.findById(userId).then((value) { 44 | if (value != null) { 45 | userService.currentUser = value; 46 | setState(() { 47 | currentUser = userService.currentUser; 48 | print('currentUser s'+currentUser.name); 49 | }); 50 | } 51 | }); 52 | } 53 | 54 | } 55 | 56 | taskService.findAll().then((value) { 57 | if (value != null && value.length > 0) { 58 | setState(() { 59 | tasks = value; 60 | tomorrowTasks = value 61 | .where((element) => element.status == TaskStatus.Task) 62 | .toList(); 63 | importantTasks = value 64 | .where((element) => element.status == TaskStatus.Important) 65 | .toList(); 66 | 67 | isLoading = false; 68 | }); 69 | } 70 | }); 71 | } 72 | isInit = true; 73 | } 74 | 75 | @override 76 | Widget build(BuildContext context) { 77 | SystemChrome.setSystemUIOverlayStyle(AppTheme.systemUiLight); 78 | return Scaffold( 79 | body: SafeArea( 80 | child: Container( 81 | child: Column( 82 | children: [ 83 | Expanded( 84 | flex: 10, 85 | child: Card( 86 | margin: EdgeInsets.zero, 87 | elevation: 0, 88 | shadowColor: AppTheme.shadow, 89 | child: Container( 90 | child: Row( 91 | children: [ 92 | Expanded( 93 | flex: 20, 94 | child: Container( 95 | child: SvgPicture.asset( 96 | 'assets/images/icon_filter.svg', 97 | color: Colors.black, 98 | ), 99 | ), 100 | ), 101 | Expanded( 102 | flex: 80, 103 | child: Container( 104 | alignment: Alignment.center, 105 | child: Text('Dashboard', 106 | style: Theme.of(context).textTheme.headline2), 107 | ), 108 | ), 109 | Expanded( 110 | flex: 20, 111 | child: Container( 112 | child: SvgPicture.asset( 113 | 'assets/images/icon_notification.svg', 114 | color: Colors.black), 115 | ), 116 | ), 117 | ], 118 | ), 119 | ), 120 | ), 121 | ), 122 | Expanded( 123 | flex: 80, 124 | child: Container( 125 | color: AppTheme.primary.withOpacity(0.04), 126 | child: SingleChildScrollView( 127 | child: Container( 128 | width: double.infinity, 129 | child: Column( 130 | children: [ 131 | Container( 132 | alignment: Alignment.centerLeft, 133 | margin: EdgeInsets.fromLTRB(16, 16, 16, 0), 134 | child: Text( 135 | currentUser == null 136 | ? 'Hi, you have 4 tasks due today' 137 | : 'Hi ${currentUser.name[0].toUpperCase()+currentUser.name.substring(1).toLowerCase()}, you have 4 tasks due today', 138 | style: Theme.of(context).textTheme.headline1, 139 | ), 140 | ), 141 | Container( 142 | width: double.infinity, 143 | margin: 144 | EdgeInsets.symmetric(vertical: 0, horizontal: 16), 145 | child: Text('Expand All', 146 | style: Theme.of(context).textTheme.headline4), 147 | ), 148 | Container( 149 | width: double.infinity, 150 | height: 190, 151 | child: ListView.builder( 152 | padding: EdgeInsets.only(left: 16), 153 | scrollDirection: Axis.horizontal, 154 | itemCount: tasks.length, 155 | itemBuilder: (context, index) { 156 | Task currentTask = tasks[index]; 157 | UserTaskDetailService userTaskDetailService = 158 | Provider.of(context, 159 | listen: false); 160 | 161 | return TaskItem( 162 | currentTask: currentTask, 163 | userTaskDetailService: userTaskDetailService); 164 | }, 165 | ), 166 | ), 167 | Container( 168 | alignment: Alignment.centerLeft, 169 | margin: EdgeInsets.fromLTRB(16, 4, 16, 0), 170 | child: Text( 171 | 'Tomorrow', 172 | style: Theme.of(context).textTheme.headline1, 173 | ), 174 | ), 175 | Container( 176 | width: double.infinity, 177 | margin: 178 | EdgeInsets.symmetric(vertical: 0, horizontal: 16), 179 | child: Text('Expand All', 180 | style: Theme.of(context).textTheme.headline4), 181 | ), 182 | Container( 183 | width: double.infinity, 184 | height: 200, 185 | child: ListView.builder( 186 | padding: EdgeInsets.only(left: 16), 187 | scrollDirection: Axis.horizontal, 188 | itemCount: tomorrowTasks.length, 189 | itemBuilder: (context, index) { 190 | Task currentTask = tomorrowTasks[index]; 191 | UserTaskDetailService userTaskDetailService = 192 | Provider.of(context, 193 | listen: false); 194 | 195 | return TaskItem( 196 | currentTask: currentTask, 197 | userTaskDetailService: userTaskDetailService); 198 | }, 199 | ), 200 | ), 201 | Container( 202 | alignment: Alignment.centerLeft, 203 | margin: EdgeInsets.fromLTRB(16, 4, 16, 0), 204 | child: Text( 205 | 'Important Tasks', 206 | style: Theme.of(context).textTheme.headline1, 207 | ), 208 | ), 209 | Container( 210 | width: double.infinity, 211 | margin: 212 | EdgeInsets.symmetric(vertical: 0, horizontal: 16), 213 | child: Text('Expand All', 214 | style: Theme.of(context).textTheme.headline4), 215 | ), 216 | Container( 217 | width: double.infinity, 218 | height: 190, 219 | child: ListView.builder( 220 | padding: EdgeInsets.only(left: 16), 221 | scrollDirection: Axis.horizontal, 222 | itemCount: importantTasks.length, 223 | itemBuilder: (context, index) { 224 | Task currentTask = importantTasks[index]; 225 | UserTaskDetailService userTaskDetailService = 226 | Provider.of(context, 227 | listen: false); 228 | 229 | return TaskItem( 230 | currentTask: currentTask, 231 | userTaskDetailService: userTaskDetailService); 232 | }, 233 | ), 234 | ), 235 | ], 236 | ), 237 | ), 238 | ), 239 | ), 240 | ), 241 | Expanded( 242 | flex: 10, 243 | child: Card( 244 | elevation: 0, 245 | margin: EdgeInsets.zero, 246 | child: Container( 247 | child: Row( 248 | children: [ 249 | Expanded( 250 | flex: 20, 251 | child: Stack( 252 | children: [ 253 | Container( 254 | width: double.infinity, 255 | height: double.infinity, 256 | child: Icon(EvaIcons.home, 257 | color: Colors.black.withOpacity(0.2)), 258 | ), 259 | Positioned.fill( 260 | child: Material( 261 | color: Colors.transparent, 262 | child: InkWell( 263 | splashFactory: InkRipple.splashFactory, 264 | splashColor: AppTheme.shadow.withOpacity(0.1), 265 | onTap: () => null, 266 | ), 267 | ), 268 | ), 269 | ], 270 | ), 271 | ), 272 | Expanded( 273 | flex: 20, 274 | child: Stack( 275 | children: [ 276 | Container( 277 | width: double.infinity, 278 | height: double.infinity, 279 | child: Icon(EvaIcons.search, 280 | color: Colors.black.withOpacity(0.2)), 281 | ), 282 | Positioned.fill( 283 | child: Material( 284 | color: Colors.transparent, 285 | child: InkWell( 286 | splashFactory: InkRipple.splashFactory, 287 | splashColor: AppTheme.shadow.withOpacity(0.1), 288 | onTap: () => null, 289 | ), 290 | ), 291 | ), 292 | ], 293 | ), 294 | ), 295 | Expanded( 296 | flex: 20, 297 | child: Container( 298 | child: CircleAvatar( 299 | backgroundColor: AppTheme.primary, 300 | child: Container( 301 | width: double.infinity, 302 | height: double.infinity, 303 | child: Icon( 304 | EvaIcons.plus, 305 | color: Colors.white, 306 | )), 307 | ), 308 | ), 309 | ), 310 | Expanded( 311 | flex: 20, 312 | child: Stack( 313 | children: [ 314 | Container( 315 | width: double.infinity, 316 | height: double.infinity, 317 | child: Icon(EvaIcons.calendar, 318 | color: Colors.black.withOpacity(0.2)), 319 | ), 320 | Positioned.fill( 321 | child: Material( 322 | color: Colors.transparent, 323 | child: InkWell( 324 | splashFactory: InkRipple.splashFactory, 325 | splashColor: AppTheme.shadow.withOpacity(0.1), 326 | onTap: () => null, 327 | ), 328 | ), 329 | ), 330 | ], 331 | ), 332 | ), 333 | Expanded( 334 | flex: 20, 335 | child: Stack( 336 | children: [ 337 | Container( 338 | width: double.infinity, 339 | height: double.infinity, 340 | child: Icon( 341 | EvaIcons.settings, 342 | color: Colors.black.withOpacity(0.2), 343 | ), 344 | ), 345 | Positioned.fill( 346 | child: Material( 347 | color: Colors.transparent, 348 | child: InkWell( 349 | splashFactory: InkRipple.splashFactory, 350 | splashColor: AppTheme.shadow.withOpacity(0.1), 351 | onTap: () => null, 352 | ), 353 | ), 354 | ), 355 | ], 356 | ), 357 | ), 358 | ], 359 | ), 360 | ), 361 | ), 362 | ), 363 | ], 364 | )), 365 | ), 366 | ); 367 | } 368 | } 369 | -------------------------------------------------------------------------------- /lib/pages/login_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter/services.dart'; 3 | import 'package:flutter_svg/flutter_svg.dart'; 4 | import 'package:provider/provider.dart'; 5 | import 'package:shared_preferences/shared_preferences.dart'; 6 | import 'package:task_app/models/user.dart'; 7 | import 'package:task_app/pages/home_screen.dart'; 8 | import 'package:task_app/services/user_service.dart'; 9 | import 'package:task_app/size_config.dart'; 10 | import 'package:task_app/style.dart'; 11 | import 'package:task_app/widgets/ShowSnackBar.dart'; 12 | 13 | class LoginScreen extends StatefulWidget { 14 | static final String routeName = 'login'; 15 | 16 | @override 17 | _LoginScreenState createState() => _LoginScreenState(); 18 | } 19 | 20 | class _LoginScreenState extends State { 21 | PageController pageViewController = 22 | new PageController(initialPage: 0, keepPage: true, viewportFraction: 1); 23 | bool isLogin = false; 24 | bool isInit = true; 25 | UserService userService; 26 | 27 | 28 | @override 29 | void initState() { 30 | // TODO: implement initState 31 | super.initState(); 32 | userService = Provider.of(context, listen: false); 33 | } 34 | 35 | @override 36 | Widget build(BuildContext context) { 37 | return Scaffold( 38 | backgroundColor: AppTheme.primary, 39 | body: SingleChildScrollView( 40 | child: Container( 41 | width: double.infinity, 42 | height: SizeConfig.screenHeight, 43 | decoration: BoxDecoration( 44 | gradient: LinearGradient( 45 | transform: GradientRotation(90), 46 | begin: Alignment.topCenter, 47 | end: Alignment.bottomCenter, 48 | colors: [ 49 | AppTheme.gradient1, 50 | AppTheme.gradient2, 51 | ]), 52 | ), 53 | child: Column( 54 | children: [ 55 | Spacer(flex: 8), 56 | Expanded( 57 | flex: 10, 58 | child: Container( 59 | child: Text( 60 | 'W', 61 | style: TextStyle( 62 | color: Colors.white, 63 | fontSize: 40, 64 | fontFamily: 'Pacifico', 65 | ), 66 | ), 67 | )), 68 | Spacer(flex: 2), 69 | Expanded( 70 | flex: 31, 71 | child: Container( 72 | width: double.infinity, 73 | height: double.infinity, 74 | child: SvgPicture.asset( 75 | 'assets/images/onboarding_img.svg'), 76 | )), 77 | Spacer(flex: 2), 78 | Expanded( 79 | flex: 6, 80 | child: Container( 81 | margin: EdgeInsets.only(left: 24), 82 | child: Row( 83 | children: [ 84 | Flexible( 85 | child: Stack( 86 | children: [ 87 | Text( 88 | 'Sign Up', 89 | style: Theme.of(context) 90 | .textTheme 91 | .headline2 92 | .copyWith( 93 | color: isLogin 94 | ? Colors.white 95 | : AppTheme.secondaryBg), 96 | ), 97 | Positioned.fill( 98 | child: Material( 99 | color: Colors.transparent, 100 | child: InkWell( 101 | splashColor: 102 | AppTheme.shadow.withOpacity(0.1), 103 | onTap: () { 104 | setState(() { 105 | isLogin = false; 106 | pageViewController.previousPage( 107 | duration: Duration( 108 | milliseconds: 500), 109 | curve: 110 | Curves.linearToEaseOut); 111 | }); 112 | }, 113 | ), 114 | ), 115 | ), 116 | ], 117 | ), 118 | ), 119 | Flexible( 120 | child: Container( 121 | margin: EdgeInsets.only(left: 16), 122 | child: Stack( 123 | children: [ 124 | Text( 125 | 'Login', 126 | style: Theme.of(context) 127 | .textTheme 128 | .headline2 129 | .copyWith( 130 | color: isLogin 131 | ? AppTheme.secondaryBg 132 | : Colors.white), 133 | ), 134 | Positioned.fill( 135 | child: Material( 136 | color: Colors.transparent, 137 | child: InkWell( 138 | splashColor: AppTheme.shadow 139 | .withOpacity(0.1), 140 | onTap: () { 141 | setState(() { 142 | isLogin = true; 143 | pageViewController.nextPage( 144 | duration: Duration( 145 | milliseconds: 500), 146 | curve: 147 | Curves.linearToEaseOut); 148 | }); 149 | }, 150 | ), 151 | ), 152 | ), 153 | ], 154 | ), 155 | ), 156 | ) 157 | ], 158 | ), 159 | )), 160 | Spacer(flex: 2), 161 | Container( 162 | height: 250, 163 | child: LoginPageView( 164 | userService: userService, 165 | pageViewController: pageViewController), 166 | ), 167 | Spacer(flex: 6), 168 | ], 169 | ), 170 | ), 171 | ), 172 | ); 173 | } 174 | 175 | 176 | } 177 | 178 | class LoginPageView extends StatelessWidget { 179 | LoginPageView({ 180 | Key key, 181 | @required this.userService, 182 | @required this.pageViewController, 183 | }) : super(key: key); 184 | 185 | final UserService userService; 186 | final PageController pageViewController; 187 | 188 | TextEditingController nameController = new TextEditingController(); 189 | TextEditingController emailController = new TextEditingController(); 190 | TextEditingController passwordController = new TextEditingController(); 191 | TextEditingController loginEmailController = new TextEditingController(); 192 | TextEditingController loginPasswordController = new TextEditingController(); 193 | User user; 194 | 195 | void signUp(BuildContext context) { 196 | if (nameController.text.isEmpty || 197 | emailController.text.isEmpty || 198 | passwordController.text.isEmpty) { 199 | ShowSnackBar( 200 | context: context, 201 | text: "Please fill the information", 202 | bgColor: AppTheme.danger) 203 | .show(); 204 | 205 | return; 206 | } 207 | 208 | user = new User( 209 | name: nameController.text, 210 | email: emailController.text, 211 | password: passwordController.text); 212 | if (user != null) { 213 | userService.add(user).then((value) { 214 | String snackBarText; 215 | print('user value' + value.toString()); 216 | if (value > 0) { 217 | snackBarText = 'Registerd Succusfully!'; 218 | Navigator.pushNamed(context, HomeScreen.routeName); 219 | } else { 220 | snackBarText = 'Email Already Exists!'; 221 | } 222 | 223 | ShowSnackBar( 224 | context: context, 225 | text: snackBarText, 226 | bgColor: value > 0 ? AppTheme.success : AppTheme.danger) 227 | .show(); 228 | }); 229 | } 230 | } 231 | 232 | void login(BuildContext context) { 233 | print('user value loginEmailController' + loginEmailController.text); 234 | print('user value loginPasswordController' + loginPasswordController.text); 235 | if (loginEmailController.text.isEmpty || 236 | loginPasswordController.text.isEmpty) { 237 | ShowSnackBar( 238 | context: context, 239 | text: 'Please fill the informations', 240 | bgColor: AppTheme.danger) 241 | .show(); 242 | 243 | return; 244 | } 245 | user = new User( 246 | email: loginEmailController.text, 247 | password: loginPasswordController.text); 248 | if (user != null) { 249 | userService.login(user).then((value) { 250 | String snackBarText; 251 | if (value != null) { 252 | snackBarText = 'Login Succusfully!'; 253 | Navigator.pushReplacementNamed(context, HomeScreen.routeName, 254 | arguments: value.id); 255 | } else { 256 | snackBarText = 'Email Already Exists!'; 257 | } 258 | ShowSnackBar( 259 | context: context, 260 | text: snackBarText, 261 | bgColor: value != null ? AppTheme.success : AppTheme.danger) 262 | .show(); 263 | }); 264 | } else { 265 | print('user value null'); 266 | } 267 | } 268 | 269 | @override 270 | Widget build(BuildContext context) { 271 | return PageView( 272 | controller: pageViewController, 273 | physics: NeverScrollableScrollPhysics(), 274 | children: [ 275 | Column( 276 | mainAxisAlignment: MainAxisAlignment.start, 277 | children: [ 278 | Container( 279 | width: double.infinity, 280 | height: 50, 281 | margin: EdgeInsets.only(left: 24, right: 24), 282 | child: Card( 283 | elevation: 0, 284 | clipBehavior: Clip.antiAlias, 285 | margin: EdgeInsets.all(0), 286 | color: AppTheme.secondary, 287 | shape: RoundedRectangleBorder( 288 | borderRadius: BorderRadius.circular(AppTheme.radius)), 289 | child: Container( 290 | padding: EdgeInsets.symmetric(vertical: 0, horizontal: 16), 291 | child: TextField( 292 | controller: nameController, 293 | style: Theme.of(context) 294 | .textTheme 295 | .headline4 296 | .copyWith(color: Colors.white), 297 | decoration: InputDecoration( 298 | border: InputBorder.none, 299 | hintText: 'Name', 300 | hintStyle: Theme.of(context) 301 | .textTheme 302 | .headline4 303 | .copyWith(color: Colors.white)), 304 | ), 305 | ), 306 | ), 307 | ), 308 | Container( 309 | width: double.infinity, 310 | height: 50, 311 | margin: EdgeInsets.only(left: 24, right: 24, top: 8), 312 | child: Card( 313 | elevation: 0, 314 | clipBehavior: Clip.antiAlias, 315 | margin: EdgeInsets.all(0), 316 | color: AppTheme.secondary, 317 | shape: RoundedRectangleBorder( 318 | borderRadius: BorderRadius.circular(AppTheme.radius)), 319 | child: Container( 320 | padding: EdgeInsets.symmetric(vertical: 0, horizontal: 16), 321 | child: TextField( 322 | controller: emailController, 323 | style: Theme.of(context) 324 | .textTheme 325 | .headline4 326 | .copyWith(color: Colors.white), 327 | decoration: InputDecoration( 328 | border: InputBorder.none, 329 | hintText: 'Email', 330 | hintStyle: Theme.of(context) 331 | .textTheme 332 | .headline4 333 | .copyWith(color: Colors.white), 334 | ), 335 | ), 336 | ), 337 | ), 338 | ), 339 | Container( 340 | width: double.infinity, 341 | height: 50, 342 | margin: EdgeInsets.only(left: 24, right: 24, top: 8), 343 | child: Card( 344 | elevation: 0, 345 | clipBehavior: Clip.antiAlias, 346 | margin: EdgeInsets.all(0), 347 | color: AppTheme.secondary, 348 | shape: RoundedRectangleBorder( 349 | borderRadius: BorderRadius.circular(AppTheme.radius)), 350 | child: Container( 351 | padding: EdgeInsets.symmetric(vertical: 0, horizontal: 16), 352 | child: TextField( 353 | controller: passwordController, 354 | style: Theme.of(context) 355 | .textTheme 356 | .headline4 357 | .copyWith(color: Colors.white), 358 | obscureText: true, 359 | decoration: InputDecoration( 360 | border: InputBorder.none, 361 | hintText: 'Password', 362 | hintStyle: Theme.of(context) 363 | .textTheme 364 | .headline4 365 | .copyWith(color: Colors.white)), 366 | ), 367 | ), 368 | ), 369 | ), 370 | Container( 371 | width: double.infinity, 372 | height: 50, 373 | margin: EdgeInsets.only(left: 24, right: 24, top: 8), 374 | child: Card( 375 | elevation: 0, 376 | clipBehavior: Clip.antiAlias, 377 | margin: EdgeInsets.all(0), 378 | color: AppTheme.secondaryBg, 379 | shape: RoundedRectangleBorder( 380 | borderRadius: BorderRadius.circular(AppTheme.radius)), 381 | child: Stack( 382 | children: [ 383 | Container( 384 | alignment: Alignment.center, 385 | child: Text( 386 | 'Submit', 387 | style: Theme.of(context) 388 | .textTheme 389 | .headline2 390 | .copyWith(color: Colors.white), 391 | )), 392 | Positioned.fill( 393 | child: Material( 394 | color: Colors.transparent, 395 | child: InkWell( 396 | splashFactory: InkRipple.splashFactory, 397 | splashColor: AppTheme.shadow.withOpacity(0.1), 398 | onTap: () { 399 | signUp(context); 400 | }, 401 | ), 402 | ), 403 | ), 404 | ], 405 | ), 406 | ), 407 | ), 408 | ], 409 | ), 410 | Column( 411 | mainAxisAlignment: MainAxisAlignment.start, 412 | children: [ 413 | Container( 414 | width: double.infinity, 415 | height: 50, 416 | margin: EdgeInsets.only( 417 | left: 24, 418 | right: 24, 419 | ), 420 | child: Card( 421 | elevation: 0, 422 | clipBehavior: Clip.antiAlias, 423 | margin: EdgeInsets.all(0), 424 | color: AppTheme.secondary, 425 | shape: RoundedRectangleBorder( 426 | borderRadius: BorderRadius.circular(AppTheme.radius)), 427 | child: Container( 428 | padding: EdgeInsets.symmetric(vertical: 0, horizontal: 16), 429 | child: TextField( 430 | controller: loginEmailController, 431 | style: Theme.of(context) 432 | .textTheme 433 | .headline4 434 | .copyWith(color: Colors.white), 435 | decoration: InputDecoration( 436 | border: InputBorder.none, 437 | hintText: 'Email', 438 | hintStyle: Theme.of(context) 439 | .textTheme 440 | .headline4 441 | .copyWith(color: Colors.white), 442 | ), 443 | ), 444 | ), 445 | ), 446 | ), 447 | Container( 448 | width: double.infinity, 449 | height: 50, 450 | margin: EdgeInsets.only(left: 24, right: 24, top: 8), 451 | child: Card( 452 | elevation: 0, 453 | clipBehavior: Clip.antiAlias, 454 | margin: EdgeInsets.all(0), 455 | color: AppTheme.secondary, 456 | shape: RoundedRectangleBorder( 457 | borderRadius: BorderRadius.circular(AppTheme.radius)), 458 | child: Container( 459 | padding: EdgeInsets.symmetric(vertical: 0, horizontal: 16), 460 | child: TextField( 461 | controller: loginPasswordController, 462 | style: Theme.of(context) 463 | .textTheme 464 | .headline4 465 | .copyWith(color: Colors.white), 466 | obscureText: true, 467 | decoration: InputDecoration( 468 | border: InputBorder.none, 469 | hintText: 'Password', 470 | hintStyle: Theme.of(context) 471 | .textTheme 472 | .headline4 473 | .copyWith(color: Colors.white)), 474 | ), 475 | ), 476 | ), 477 | ), 478 | Container( 479 | width: double.infinity, 480 | height: 50, 481 | margin: EdgeInsets.only(left: 24, right: 24, top: 8), 482 | child: Card( 483 | elevation: 0, 484 | clipBehavior: Clip.antiAlias, 485 | margin: EdgeInsets.all(0), 486 | color: AppTheme.secondaryBg, 487 | shape: RoundedRectangleBorder( 488 | borderRadius: BorderRadius.circular(AppTheme.radius)), 489 | child: Stack( 490 | children: [ 491 | Container( 492 | alignment: Alignment.center, 493 | child: Text( 494 | 'Submit', 495 | style: Theme.of(context) 496 | .textTheme 497 | .headline2 498 | .copyWith(color: Colors.white), 499 | )), 500 | Positioned.fill( 501 | child: Material( 502 | color: Colors.transparent, 503 | child: InkWell( 504 | splashFactory: InkRipple.splashFactory, 505 | splashColor: AppTheme.shadow.withOpacity(0.1), 506 | onTap: () { 507 | login(context); 508 | }, 509 | ), 510 | ), 511 | ), 512 | ], 513 | ), 514 | ), 515 | ), 516 | ], 517 | ), 518 | ], 519 | ); 520 | } 521 | } 522 | -------------------------------------------------------------------------------- /lib/services/task_service.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:flutter/cupertino.dart'; 4 | import 'package:task_app/constant.dart'; 5 | import 'package:task_app/models/task.dart'; 6 | 7 | import 'package:http/http.dart' as http; 8 | 9 | class TaskService extends ChangeNotifier { 10 | List items; 11 | Task currentTask; 12 | 13 | Future> findAll() async { 14 | var response = await http.get(Constant.REST_URL + '/task/'); 15 | 16 | if (response.statusCode == 200) { 17 | List data = json.decode(response.body); 18 | items = data.map((e) => Task.fromJson(e)).toList(); 19 | return items; 20 | } else { 21 | throw Exception('No Data Found'); 22 | } 23 | } 24 | 25 | 26 | Future findById(int id) async { 27 | var response = await http.get(Constant.REST_URL + '/task/' + id.toString()); 28 | 29 | if (response.statusCode == 200) { 30 | dynamic data = json.decode(response.body); 31 | Task currentTask = Task.fromJson(data); 32 | print('id==findById currentTask'); 33 | return currentTask; 34 | } else { 35 | print('id==findById error'); 36 | throw Exception('No Data Found'); 37 | } 38 | } 39 | 40 | Future add(Task task) async { 41 | var response = await http.post(Constant.REST_URL + '/task/', 42 | headers: {'Content-Type': 'application/json'}, 43 | body: json.encode(task.toJson())); 44 | 45 | print('task' + response.statusCode.toString()); 46 | 47 | if (response.statusCode == 200) { 48 | dynamic data = json.decode(response.body); 49 | int result = int.parse(data.toString()); 50 | return result; 51 | } else { 52 | throw Exception('No Data Found'); 53 | } 54 | } 55 | 56 | Future update(int id, Task task) async { 57 | var response = await http.put(Constant.REST_URL + '/task/' + id.toString(), 58 | headers: {'Content-Type': 'application/json'}, 59 | body: json.encode(task.toJson())); 60 | 61 | if (response.statusCode == 200) { 62 | dynamic data = json.decode(response.body); 63 | Task newTask = Task.fromJson(data); 64 | return newTask; 65 | } else { 66 | throw Exception('No Data Found'); 67 | } 68 | } 69 | 70 | Future deleteById(int id) async { 71 | var response = await http.delete( 72 | Constant.REST_URL + '/task/' + id.toString(), 73 | headers: {'Content-Type': 'application/json'}, 74 | ); 75 | 76 | if (response.statusCode == 200) { 77 | int data = json.decode(response.body); 78 | return data; 79 | } else { 80 | throw Exception('No Data Found'); 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /lib/services/user_service.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:flutter/cupertino.dart'; 4 | import 'package:shared_preferences/shared_preferences.dart'; 5 | import 'package:task_app/constant.dart'; 6 | import 'package:task_app/models/user.dart'; 7 | 8 | import 'package:http/http.dart' as http; 9 | 10 | class UserService extends ChangeNotifier { 11 | List items; 12 | User currentUser; 13 | 14 | Future> findAll() async { 15 | var response = await http.get(Constant.REST_URL + '/user/'); 16 | 17 | if (response.statusCode == 200) { 18 | List data = json.decode(response.body); 19 | items = data.map((e) => User.fromJson(e)).toList(); 20 | return items; 21 | } else { 22 | throw Exception('No Data Found'); 23 | } 24 | } 25 | 26 | Future login(User user) async { 27 | var queryParams; 28 | 29 | if (!user.email.isEmpty && !user.password.isEmpty) { 30 | queryParams = { 31 | 'email': user.email, 32 | 'password': user.password, 33 | }; 34 | String url = Constant.REST_URL + 35 | '/user/login?' + 36 | Uri(queryParameters: queryParams).query; 37 | 38 | var response = await http.get(url); 39 | print('login response' + response.statusCode.toString()); 40 | 41 | if (response.statusCode == 200) { 42 | dynamic data = json.decode(response.body); 43 | User currentUser = User.fromJson(data); 44 | this.currentUser=currentUser; 45 | saveUserMemory(); 46 | 47 | return currentUser; 48 | } else { 49 | throw Exception('No Data Found'); 50 | } 51 | }else{ 52 | return null; 53 | } 54 | 55 | } 56 | 57 | Future saveUserMemory() async { 58 | //set SharedPreferences 59 | SharedPreferences prefs = await SharedPreferences.getInstance(); 60 | await prefs.setInt('userId', currentUser.id,); 61 | } 62 | 63 | Future findById(int id) async { 64 | var response = await http.get(Constant.REST_URL + '/user/' + id.toString()); 65 | 66 | if (response.statusCode == 200) { 67 | dynamic data = json.decode(response.body); 68 | User currentUser = User.fromJson(data); 69 | print('id==findById currentUser'); 70 | return currentUser; 71 | } else { 72 | print('id==findById error'); 73 | throw Exception('No Data Found'); 74 | } 75 | } 76 | 77 | Future add(User user) async { 78 | print('user' + user.email + ' ' + user.password); 79 | var response = await http.post(Constant.REST_URL + '/user/', 80 | headers: {'Content-Type': 'application/json'}, 81 | body: json.encode(user.toJson())); 82 | 83 | print('user' + response.statusCode.toString()); 84 | 85 | if (response.statusCode == 200) { 86 | dynamic data = json.decode(response.body); 87 | int result = int.parse(data.toString()); 88 | return result; 89 | } else { 90 | throw Exception('No Data Found'); 91 | } 92 | } 93 | 94 | 95 | 96 | Future update(int id, User user) async { 97 | var response = await http.put(Constant.REST_URL + '/user/' + id.toString(), 98 | headers: {'Content-Type': 'application/json'}, 99 | body: json.encode(user.toJson())); 100 | 101 | if (response.statusCode == 200) { 102 | dynamic data = json.decode(response.body); 103 | User newUser = User.fromJson(data); 104 | return newUser; 105 | } else { 106 | throw Exception('No Data Found'); 107 | } 108 | } 109 | 110 | Future deleteById(int id) async { 111 | var response = await http.delete( 112 | Constant.REST_URL + '/user/' + id.toString(), 113 | headers: {'Content-Type': 'application/json'}, 114 | ); 115 | 116 | if (response.statusCode == 200) { 117 | int data = json.decode(response.body); 118 | return data; 119 | } else { 120 | throw Exception('No Data Found'); 121 | } 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /lib/services/user_task_detail_service.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:flutter/cupertino.dart'; 4 | import 'package:task_app/constant.dart'; 5 | import 'package:task_app/models/task.dart'; 6 | import 'package:task_app/models/user.dart'; 7 | import 'package:task_app/models/user_task_detail.dart'; 8 | 9 | import 'package:http/http.dart' as http; 10 | 11 | class UserTaskDetailService extends ChangeNotifier { 12 | List items; 13 | UserTaskDetail currentUserTaskDetail; 14 | 15 | Future> findAll() async { 16 | var response = await http.get(Constant.REST_URL + '/userTaskDetail/'); 17 | 18 | if (response.statusCode == 200) { 19 | List data = json.decode(response.body); 20 | items = data.map((e) => UserTaskDetail.fromJson(e)).toList(); 21 | return items; 22 | } else { 23 | throw Exception('No Data Found'); 24 | } 25 | } 26 | 27 | 28 | Future findById(int id) async { 29 | var response = await http.get(Constant.REST_URL + '/userTaskDetail/' + id.toString()); 30 | 31 | if (response.statusCode == 200) { 32 | dynamic data = json.decode(response.body); 33 | UserTaskDetail currentUserTaskDetail = UserTaskDetail.fromJson(data); 34 | print('id==findById currentUserTaskDetail'); 35 | return currentUserTaskDetail; 36 | } else { 37 | print('id==findById error'); 38 | throw Exception('No Data Found'); 39 | } 40 | } 41 | 42 | Future add(UserTaskDetail userTaskDetail) async { 43 | var response = await http.post(Constant.REST_URL + '/userTaskDetail/', 44 | headers: {'Content-Type': 'application/json'}, 45 | body: json.encode(userTaskDetail.toJson())); 46 | 47 | print('userTaskDetail' + response.statusCode.toString()); 48 | 49 | if (response.statusCode == 200) { 50 | dynamic data = json.decode(response.body); 51 | int result = int.parse(data.toString()); 52 | return result; 53 | } else { 54 | throw Exception('No Data Found'); 55 | } 56 | } 57 | 58 | Future update(int id, UserTaskDetail userTaskDetail) async { 59 | var response = await http.put(Constant.REST_URL + '/userTaskDetail/' + id.toString(), 60 | headers: {'Content-Type': 'application/json'}, 61 | body: json.encode(userTaskDetail.toJson())); 62 | 63 | if (response.statusCode == 200) { 64 | dynamic data = json.decode(response.body); 65 | UserTaskDetail newUserTaskDetail = UserTaskDetail.fromJson(data); 66 | return newUserTaskDetail; 67 | } else { 68 | throw Exception('No Data Found'); 69 | } 70 | } 71 | 72 | Future deleteById(int id) async { 73 | var response = await http.delete( 74 | Constant.REST_URL + '/userTaskDetail/' + id.toString(), 75 | headers: {'Content-Type': 'application/json'}, 76 | ); 77 | 78 | if (response.statusCode == 200) { 79 | int data = json.decode(response.body); 80 | return data; 81 | } else { 82 | throw Exception('No Data Found'); 83 | } 84 | } 85 | 86 | 87 | Future> findAllByTask_Id(int taskId) async { 88 | var response = await http.get(Constant.REST_URL + '/userTaskDetail/taskId/'+taskId.toString()); 89 | 90 | if (response.statusCode == 200) { 91 | List data = json.decode(response.body); 92 | List users = data.map((e) => User.fromJson(e)).toList(); 93 | return users; 94 | } else { 95 | throw Exception('No Data Found'); 96 | } 97 | } 98 | 99 | Future> findAllByUser_Id(int userId) async { 100 | var response = await http.get(Constant.REST_URL + '/userTaskDetail/userId/'+userId.toString()); 101 | 102 | if (response.statusCode == 200) { 103 | List data = json.decode(response.body); 104 | List tasks = data.map((e) => Task.fromJson(e)).toList(); 105 | return tasks; 106 | } else { 107 | throw Exception('No Data Found'); 108 | } 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /lib/size_config.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/widgets.dart'; 2 | 3 | class SizeConfig { 4 | static double _blockWidth = 0; 5 | static double _blockHeight = 0; 6 | 7 | static double textMultiplier; 8 | static double imageSizeMultiplier; 9 | static double heightMultiplier; 10 | static double widthMultiplier; 11 | static bool isPortrait = true; 12 | static bool isMobilePortrait = false; 13 | static double screenWidth; 14 | static double screenHeight; 15 | 16 | void init(BoxConstraints constraints, Orientation orientation) { 17 | if (orientation == Orientation.portrait) { 18 | screenWidth = constraints.maxWidth; 19 | screenHeight = constraints.maxHeight; 20 | isPortrait = true; 21 | if (screenWidth < 450) { 22 | isMobilePortrait = true; 23 | } 24 | } else { 25 | screenWidth = constraints.maxHeight; 26 | screenHeight = constraints.maxWidth; 27 | isPortrait = false; 28 | isMobilePortrait = false; 29 | } 30 | 31 | _blockWidth = screenWidth / 100; 32 | _blockHeight = screenHeight / 100; 33 | 34 | textMultiplier = _blockHeight; 35 | imageSizeMultiplier = _blockWidth; 36 | 37 | heightMultiplier = _blockHeight; 38 | widthMultiplier = _blockWidth; 39 | 40 | print(screenWidth); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /lib/style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter/services.dart'; 3 | 4 | class AppTheme { 5 | static const Color appBackgroundColor = Color(0xFFFFF7EC); 6 | static const Color topBarBackgroundColor = Color(0xFFFFD974); 7 | static const Color selectedTabBackgroundColor = Color(0xFFFFC442); 8 | static const Color primary = Color(0xFF147BDF); 9 | static Color secondary = Color(0xFF0763BD).withOpacity(0.5); 10 | static const Color danger = Color(0xFFFF8484); 11 | static const Color success = Color(0xFF07E079); 12 | static const Color warning = Color(0xFFF7B500); 13 | static const Color info = Color(0xFF0095FF); 14 | static const List taskColors = [Color(0xFF53D7FF),Color(0xFFFF66B8),Color(0xFF07E079)]; 15 | static const List taskStatusColors = [Color(0xFFF5A623),Color(0xFFA880E3),Color(0xFF2DD8CF),Color(0xFFFF8484)]; 16 | static const Color headlineTextColor = Colors.black; 17 | static const Color subTitleTextColor = Color(0xFF9B9B9B); 18 | static const Color bg = Color(0xFFFFFFFF); 19 | static const Color secondaryBg = Color(0xFFFFD053); 20 | static Color shadow = Color(0xFFBCBCBC).withOpacity(0.3); 21 | static Color borderCard = Color(0xFF707070).withOpacity(0.5); 22 | static const Color fb = Color(0xFF0041A8); 23 | static const Color twitter = Color(0xFF42AAFF); 24 | static const Color google = Color(0xFFF2F8FF); 25 | static const Color footertext = Color(0xFFC5CEE0); 26 | static const Color gradient1 = Color(0xFF1DA1F3); 27 | static const Color gradient2 = Color(0xFF4173CC); 28 | static const double radius = 5.0; 29 | 30 | static final ThemeData lightTheme = ThemeData( 31 | scaffoldBackgroundColor: AppTheme.bg, 32 | backgroundColor: AppTheme.bg, 33 | brightness: Brightness.light, 34 | primaryColor: AppTheme.headlineTextColor, 35 | textTheme: lightTextTheme, 36 | ); 37 | 38 | static final ThemeData darkTheme = ThemeData( 39 | scaffoldBackgroundColor: Colors.black, 40 | brightness: Brightness.dark, 41 | primaryColor: AppTheme.bg, 42 | textTheme: darkTextTheme, 43 | ); 44 | 45 | static final TextTheme lightTextTheme = TextTheme( 46 | headline1: _headline1, 47 | headline2: _headline2, 48 | headline3: _headline3, 49 | headline4: _headline4, 50 | headline5: _headline5, 51 | headline6: _headline6, 52 | button: _button, 53 | subtitle1: _subtitle1, 54 | subtitle2: _subtitle2, 55 | bodyText1: _bodyText1, 56 | bodyText2: _bodyText2, 57 | ); 58 | 59 | static final TextTheme darkTextTheme = TextTheme( 60 | headline1: _headline1.copyWith(color: Colors.white), 61 | headline2: _headline2.copyWith(color: Colors.white), 62 | headline3: _headline3.copyWith(color: Colors.white), 63 | headline4: _headline4.copyWith(color: Colors.white), 64 | headline5: _headline5.copyWith(color: Colors.white), 65 | headline6: _headline6.copyWith(color: Colors.white), 66 | button: _button.copyWith(color: AppTheme.headlineTextColor), 67 | subtitle1: _subtitle1.copyWith(color: Colors.white), 68 | subtitle2: _subtitle2.copyWith(color: Colors.white), 69 | bodyText1: _bodyText1.copyWith(color: AppTheme.primary), 70 | bodyText2: _bodyText2.copyWith(color: AppTheme.secondaryBg), 71 | ); 72 | 73 | static final TextStyle _headline1 = TextStyle( 74 | color: Colors.black, 75 | fontFamily: "Poppins", 76 | fontSize: 24, 77 | ); 78 | static final TextStyle _headline2 = TextStyle( 79 | fontFamily: "Poppins", 80 | color: Colors.black, 81 | fontWeight: FontWeight.w500, 82 | fontSize: 18, 83 | ); 84 | static final TextStyle _headline3 = TextStyle( 85 | fontFamily: "Poppins", 86 | color: Colors.black, 87 | fontSize: 18, 88 | ); 89 | static final TextStyle _headline4 = TextStyle( 90 | fontFamily: "Poppins", 91 | color: AppTheme.subTitleTextColor.withOpacity(0.6), 92 | fontSize: 14, 93 | ); 94 | static final TextStyle _headline5 = TextStyle( 95 | fontFamily: "Poppins", 96 | color: Colors.black, 97 | fontSize: 14, 98 | ); 99 | static final TextStyle _headline6 = TextStyle( 100 | color: AppTheme.subTitleTextColor, 101 | fontWeight: FontWeight.w600, 102 | fontFamily: "Lato", 103 | fontSize: 16, 104 | ); 105 | 106 | static final TextStyle _button = TextStyle( 107 | color: Colors.white, 108 | fontWeight: FontWeight.w900, 109 | fontFamily: "Lato", 110 | fontSize: 18, 111 | ); 112 | 113 | static final TextStyle _subtitle1 = TextStyle( 114 | color: AppTheme.headlineTextColor, 115 | fontWeight: FontWeight.w900, 116 | fontFamily: "Lato", 117 | fontSize: 14, 118 | ); 119 | 120 | static final TextStyle _subtitle2 = TextStyle( 121 | color: AppTheme.subTitleTextColor, 122 | fontWeight: FontWeight.w900, 123 | fontFamily: "Lato", 124 | fontSize: 14, 125 | ); 126 | 127 | static final TextStyle _bodyText1 = TextStyle( 128 | color: AppTheme.headlineTextColor, 129 | fontFamily: "Poppins", 130 | fontSize: 12, 131 | letterSpacing: 1, 132 | ); 133 | 134 | static final TextStyle _bodyText2 = TextStyle( 135 | color: AppTheme.subTitleTextColor, 136 | fontFamily: "Poppins", 137 | fontSize: 12, 138 | letterSpacing: 1, 139 | 140 | ); 141 | 142 | static final SystemUiOverlayStyle systemUiDark = SystemUiOverlayStyle( 143 | systemNavigationBarColor: AppTheme.headlineTextColor, 144 | statusBarColor: AppTheme.headlineTextColor, 145 | statusBarIconBrightness: Brightness.light, 146 | ); 147 | 148 | static final SystemUiOverlayStyle systemUiLight = SystemUiOverlayStyle( 149 | systemNavigationBarColor: Colors.white, 150 | statusBarColor: Colors.white, 151 | statusBarIconBrightness: Brightness.dark, 152 | ); 153 | 154 | static final SystemUiOverlayStyle systemUiTrans = SystemUiOverlayStyle( 155 | systemNavigationBarColor: AppTheme.primary, 156 | statusBarColor: Colors.transparent, 157 | statusBarIconBrightness: Brightness.dark, 158 | 159 | ); 160 | 161 | 162 | } 163 | -------------------------------------------------------------------------------- /lib/widgets/ShowSnackBar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:task_app/style.dart'; 4 | 5 | class ShowSnackBar { 6 | 7 | 8 | final BuildContext context; 9 | final String text; 10 | final Color textColor; 11 | final Color bgColor; 12 | 13 | 14 | ShowSnackBar({@required this.context,this.text="", this.textColor=Colors.white, this.bgColor=AppTheme.primary}); 15 | 16 | void show(){ 17 | final snackBar = SnackBar( 18 | content: Text( 19 | text, 20 | style: Theme.of(context) 21 | .textTheme 22 | .headline4 23 | .copyWith(color: textColor), 24 | ), 25 | backgroundColor: bgColor, 26 | ); 27 | Scaffold.of(context).hideCurrentSnackBar(); 28 | Scaffold.of(context).showSnackBar(snackBar); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | _fe_analyzer_shared: 5 | dependency: transitive 6 | description: 7 | name: _fe_analyzer_shared 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "14.0.0" 11 | align_positioned: 12 | dependency: "direct main" 13 | description: 14 | name: align_positioned 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "1.2.14" 18 | analyzer: 19 | dependency: transitive 20 | description: 21 | name: analyzer 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "0.41.1" 25 | args: 26 | dependency: transitive 27 | description: 28 | name: args 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "1.6.0" 32 | async: 33 | dependency: transitive 34 | description: 35 | name: async 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "2.5.0-nullsafety.1" 39 | boolean_selector: 40 | dependency: transitive 41 | description: 42 | name: boolean_selector 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "2.1.0-nullsafety.1" 46 | build: 47 | dependency: transitive 48 | description: 49 | name: build 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "1.6.0" 53 | build_config: 54 | dependency: transitive 55 | description: 56 | name: build_config 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "0.4.5" 60 | build_daemon: 61 | dependency: transitive 62 | description: 63 | name: build_daemon 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "2.1.4" 67 | build_resolvers: 68 | dependency: transitive 69 | description: 70 | name: build_resolvers 71 | url: "https://pub.dartlang.org" 72 | source: hosted 73 | version: "1.5.1" 74 | build_runner: 75 | dependency: "direct dev" 76 | description: 77 | name: build_runner 78 | url: "https://pub.dartlang.org" 79 | source: hosted 80 | version: "1.10.11" 81 | build_runner_core: 82 | dependency: transitive 83 | description: 84 | name: build_runner_core 85 | url: "https://pub.dartlang.org" 86 | source: hosted 87 | version: "6.1.5" 88 | built_collection: 89 | dependency: transitive 90 | description: 91 | name: built_collection 92 | url: "https://pub.dartlang.org" 93 | source: hosted 94 | version: "4.3.2" 95 | built_value: 96 | dependency: transitive 97 | description: 98 | name: built_value 99 | url: "https://pub.dartlang.org" 100 | source: hosted 101 | version: "7.1.0" 102 | cached_network_image: 103 | dependency: "direct main" 104 | description: 105 | name: cached_network_image 106 | url: "https://pub.dartlang.org" 107 | source: hosted 108 | version: "2.4.1" 109 | characters: 110 | dependency: transitive 111 | description: 112 | name: characters 113 | url: "https://pub.dartlang.org" 114 | source: hosted 115 | version: "1.1.0-nullsafety.3" 116 | charcode: 117 | dependency: transitive 118 | description: 119 | name: charcode 120 | url: "https://pub.dartlang.org" 121 | source: hosted 122 | version: "1.2.0-nullsafety.1" 123 | checked_yaml: 124 | dependency: transitive 125 | description: 126 | name: checked_yaml 127 | url: "https://pub.dartlang.org" 128 | source: hosted 129 | version: "1.0.4" 130 | cli_util: 131 | dependency: transitive 132 | description: 133 | name: cli_util 134 | url: "https://pub.dartlang.org" 135 | source: hosted 136 | version: "0.2.0" 137 | clock: 138 | dependency: transitive 139 | description: 140 | name: clock 141 | url: "https://pub.dartlang.org" 142 | source: hosted 143 | version: "1.1.0-nullsafety.1" 144 | code_builder: 145 | dependency: transitive 146 | description: 147 | name: code_builder 148 | url: "https://pub.dartlang.org" 149 | source: hosted 150 | version: "3.5.0" 151 | collection: 152 | dependency: transitive 153 | description: 154 | name: collection 155 | url: "https://pub.dartlang.org" 156 | source: hosted 157 | version: "1.15.0-nullsafety.3" 158 | convert: 159 | dependency: transitive 160 | description: 161 | name: convert 162 | url: "https://pub.dartlang.org" 163 | source: hosted 164 | version: "2.1.1" 165 | crypto: 166 | dependency: transitive 167 | description: 168 | name: crypto 169 | url: "https://pub.dartlang.org" 170 | source: hosted 171 | version: "2.1.5" 172 | cupertino_icons: 173 | dependency: "direct main" 174 | description: 175 | name: cupertino_icons 176 | url: "https://pub.dartlang.org" 177 | source: hosted 178 | version: "1.0.0" 179 | dart_style: 180 | dependency: transitive 181 | description: 182 | name: dart_style 183 | url: "https://pub.dartlang.org" 184 | source: hosted 185 | version: "1.3.10" 186 | dotted_border: 187 | dependency: "direct main" 188 | description: 189 | name: dotted_border 190 | url: "https://pub.dartlang.org" 191 | source: hosted 192 | version: "1.0.7" 193 | eva_icons_flutter: 194 | dependency: "direct main" 195 | description: 196 | name: eva_icons_flutter 197 | url: "https://pub.dartlang.org" 198 | source: hosted 199 | version: "2.0.1" 200 | fake_async: 201 | dependency: transitive 202 | description: 203 | name: fake_async 204 | url: "https://pub.dartlang.org" 205 | source: hosted 206 | version: "1.2.0-nullsafety.1" 207 | ffi: 208 | dependency: transitive 209 | description: 210 | name: ffi 211 | url: "https://pub.dartlang.org" 212 | source: hosted 213 | version: "0.1.3" 214 | file: 215 | dependency: transitive 216 | description: 217 | name: file 218 | url: "https://pub.dartlang.org" 219 | source: hosted 220 | version: "5.2.1" 221 | fixnum: 222 | dependency: transitive 223 | description: 224 | name: fixnum 225 | url: "https://pub.dartlang.org" 226 | source: hosted 227 | version: "0.10.11" 228 | flutter: 229 | dependency: "direct main" 230 | description: flutter 231 | source: sdk 232 | version: "0.0.0" 233 | flutter_blurhash: 234 | dependency: transitive 235 | description: 236 | name: flutter_blurhash 237 | url: "https://pub.dartlang.org" 238 | source: hosted 239 | version: "0.5.0" 240 | flutter_cache_manager: 241 | dependency: transitive 242 | description: 243 | name: flutter_cache_manager 244 | url: "https://pub.dartlang.org" 245 | source: hosted 246 | version: "2.0.0" 247 | flutter_svg: 248 | dependency: "direct main" 249 | description: 250 | name: flutter_svg 251 | url: "https://pub.dartlang.org" 252 | source: hosted 253 | version: "0.19.1" 254 | flutter_test: 255 | dependency: "direct dev" 256 | description: flutter 257 | source: sdk 258 | version: "0.0.0" 259 | flutter_web_plugins: 260 | dependency: transitive 261 | description: flutter 262 | source: sdk 263 | version: "0.0.0" 264 | glob: 265 | dependency: transitive 266 | description: 267 | name: glob 268 | url: "https://pub.dartlang.org" 269 | source: hosted 270 | version: "1.2.0" 271 | graphs: 272 | dependency: transitive 273 | description: 274 | name: graphs 275 | url: "https://pub.dartlang.org" 276 | source: hosted 277 | version: "0.2.0" 278 | http: 279 | dependency: "direct main" 280 | description: 281 | name: http 282 | url: "https://pub.dartlang.org" 283 | source: hosted 284 | version: "0.12.2" 285 | http_multi_server: 286 | dependency: transitive 287 | description: 288 | name: http_multi_server 289 | url: "https://pub.dartlang.org" 290 | source: hosted 291 | version: "2.2.0" 292 | http_parser: 293 | dependency: transitive 294 | description: 295 | name: http_parser 296 | url: "https://pub.dartlang.org" 297 | source: hosted 298 | version: "3.1.4" 299 | intl: 300 | dependency: "direct main" 301 | description: 302 | name: intl 303 | url: "https://pub.dartlang.org" 304 | source: hosted 305 | version: "0.16.1" 306 | io: 307 | dependency: transitive 308 | description: 309 | name: io 310 | url: "https://pub.dartlang.org" 311 | source: hosted 312 | version: "0.3.4" 313 | js: 314 | dependency: transitive 315 | description: 316 | name: js 317 | url: "https://pub.dartlang.org" 318 | source: hosted 319 | version: "0.6.2" 320 | json_annotation: 321 | dependency: "direct main" 322 | description: 323 | name: json_annotation 324 | url: "https://pub.dartlang.org" 325 | source: hosted 326 | version: "3.1.1" 327 | json_serializable: 328 | dependency: "direct dev" 329 | description: 330 | name: json_serializable 331 | url: "https://pub.dartlang.org" 332 | source: hosted 333 | version: "3.5.1" 334 | logging: 335 | dependency: transitive 336 | description: 337 | name: logging 338 | url: "https://pub.dartlang.org" 339 | source: hosted 340 | version: "0.11.4" 341 | matcher: 342 | dependency: transitive 343 | description: 344 | name: matcher 345 | url: "https://pub.dartlang.org" 346 | source: hosted 347 | version: "0.12.10-nullsafety.1" 348 | matrix4_transform: 349 | dependency: transitive 350 | description: 351 | name: matrix4_transform 352 | url: "https://pub.dartlang.org" 353 | source: hosted 354 | version: "1.1.6" 355 | meta: 356 | dependency: transitive 357 | description: 358 | name: meta 359 | url: "https://pub.dartlang.org" 360 | source: hosted 361 | version: "1.3.0-nullsafety.3" 362 | mime: 363 | dependency: transitive 364 | description: 365 | name: mime 366 | url: "https://pub.dartlang.org" 367 | source: hosted 368 | version: "0.9.7" 369 | node_interop: 370 | dependency: transitive 371 | description: 372 | name: node_interop 373 | url: "https://pub.dartlang.org" 374 | source: hosted 375 | version: "1.2.1" 376 | node_io: 377 | dependency: transitive 378 | description: 379 | name: node_io 380 | url: "https://pub.dartlang.org" 381 | source: hosted 382 | version: "1.2.0" 383 | octo_image: 384 | dependency: transitive 385 | description: 386 | name: octo_image 387 | url: "https://pub.dartlang.org" 388 | source: hosted 389 | version: "0.3.0" 390 | package_config: 391 | dependency: transitive 392 | description: 393 | name: package_config 394 | url: "https://pub.dartlang.org" 395 | source: hosted 396 | version: "1.9.3" 397 | path: 398 | dependency: transitive 399 | description: 400 | name: path 401 | url: "https://pub.dartlang.org" 402 | source: hosted 403 | version: "1.8.0-nullsafety.1" 404 | path_drawing: 405 | dependency: transitive 406 | description: 407 | name: path_drawing 408 | url: "https://pub.dartlang.org" 409 | source: hosted 410 | version: "0.4.1+1" 411 | path_parsing: 412 | dependency: transitive 413 | description: 414 | name: path_parsing 415 | url: "https://pub.dartlang.org" 416 | source: hosted 417 | version: "0.1.4" 418 | path_provider: 419 | dependency: transitive 420 | description: 421 | name: path_provider 422 | url: "https://pub.dartlang.org" 423 | source: hosted 424 | version: "1.6.24" 425 | path_provider_linux: 426 | dependency: transitive 427 | description: 428 | name: path_provider_linux 429 | url: "https://pub.dartlang.org" 430 | source: hosted 431 | version: "0.0.1+2" 432 | path_provider_macos: 433 | dependency: transitive 434 | description: 435 | name: path_provider_macos 436 | url: "https://pub.dartlang.org" 437 | source: hosted 438 | version: "0.0.4+6" 439 | path_provider_platform_interface: 440 | dependency: transitive 441 | description: 442 | name: path_provider_platform_interface 443 | url: "https://pub.dartlang.org" 444 | source: hosted 445 | version: "1.0.4" 446 | path_provider_windows: 447 | dependency: transitive 448 | description: 449 | name: path_provider_windows 450 | url: "https://pub.dartlang.org" 451 | source: hosted 452 | version: "0.0.4+3" 453 | pedantic: 454 | dependency: transitive 455 | description: 456 | name: pedantic 457 | url: "https://pub.dartlang.org" 458 | source: hosted 459 | version: "1.9.2" 460 | petitparser: 461 | dependency: transitive 462 | description: 463 | name: petitparser 464 | url: "https://pub.dartlang.org" 465 | source: hosted 466 | version: "3.1.0" 467 | platform: 468 | dependency: transitive 469 | description: 470 | name: platform 471 | url: "https://pub.dartlang.org" 472 | source: hosted 473 | version: "2.2.1" 474 | plugin_platform_interface: 475 | dependency: transitive 476 | description: 477 | name: plugin_platform_interface 478 | url: "https://pub.dartlang.org" 479 | source: hosted 480 | version: "1.0.3" 481 | pool: 482 | dependency: transitive 483 | description: 484 | name: pool 485 | url: "https://pub.dartlang.org" 486 | source: hosted 487 | version: "1.4.0" 488 | process: 489 | dependency: transitive 490 | description: 491 | name: process 492 | url: "https://pub.dartlang.org" 493 | source: hosted 494 | version: "3.0.13" 495 | provider: 496 | dependency: "direct main" 497 | description: 498 | name: provider 499 | url: "https://pub.dartlang.org" 500 | source: hosted 501 | version: "3.2.0" 502 | pub_semver: 503 | dependency: transitive 504 | description: 505 | name: pub_semver 506 | url: "https://pub.dartlang.org" 507 | source: hosted 508 | version: "1.4.4" 509 | pubspec_parse: 510 | dependency: transitive 511 | description: 512 | name: pubspec_parse 513 | url: "https://pub.dartlang.org" 514 | source: hosted 515 | version: "0.1.7" 516 | quiver: 517 | dependency: transitive 518 | description: 519 | name: quiver 520 | url: "https://pub.dartlang.org" 521 | source: hosted 522 | version: "2.1.5" 523 | rxdart: 524 | dependency: transitive 525 | description: 526 | name: rxdart 527 | url: "https://pub.dartlang.org" 528 | source: hosted 529 | version: "0.24.1" 530 | shared_preferences: 531 | dependency: "direct main" 532 | description: 533 | name: shared_preferences 534 | url: "https://pub.dartlang.org" 535 | source: hosted 536 | version: "0.5.12+4" 537 | shared_preferences_linux: 538 | dependency: transitive 539 | description: 540 | name: shared_preferences_linux 541 | url: "https://pub.dartlang.org" 542 | source: hosted 543 | version: "0.0.2+4" 544 | shared_preferences_macos: 545 | dependency: transitive 546 | description: 547 | name: shared_preferences_macos 548 | url: "https://pub.dartlang.org" 549 | source: hosted 550 | version: "0.0.1+11" 551 | shared_preferences_platform_interface: 552 | dependency: transitive 553 | description: 554 | name: shared_preferences_platform_interface 555 | url: "https://pub.dartlang.org" 556 | source: hosted 557 | version: "1.0.4" 558 | shared_preferences_web: 559 | dependency: transitive 560 | description: 561 | name: shared_preferences_web 562 | url: "https://pub.dartlang.org" 563 | source: hosted 564 | version: "0.1.2+7" 565 | shared_preferences_windows: 566 | dependency: transitive 567 | description: 568 | name: shared_preferences_windows 569 | url: "https://pub.dartlang.org" 570 | source: hosted 571 | version: "0.0.1+3" 572 | shelf: 573 | dependency: transitive 574 | description: 575 | name: shelf 576 | url: "https://pub.dartlang.org" 577 | source: hosted 578 | version: "0.7.9" 579 | shelf_web_socket: 580 | dependency: transitive 581 | description: 582 | name: shelf_web_socket 583 | url: "https://pub.dartlang.org" 584 | source: hosted 585 | version: "0.2.3" 586 | sky_engine: 587 | dependency: transitive 588 | description: flutter 589 | source: sdk 590 | version: "0.0.99" 591 | source_gen: 592 | dependency: transitive 593 | description: 594 | name: source_gen 595 | url: "https://pub.dartlang.org" 596 | source: hosted 597 | version: "0.9.10+1" 598 | source_span: 599 | dependency: transitive 600 | description: 601 | name: source_span 602 | url: "https://pub.dartlang.org" 603 | source: hosted 604 | version: "1.8.0-nullsafety.2" 605 | sqflite: 606 | dependency: transitive 607 | description: 608 | name: sqflite 609 | url: "https://pub.dartlang.org" 610 | source: hosted 611 | version: "1.3.2+1" 612 | sqflite_common: 613 | dependency: transitive 614 | description: 615 | name: sqflite_common 616 | url: "https://pub.dartlang.org" 617 | source: hosted 618 | version: "1.0.2+1" 619 | stack_trace: 620 | dependency: transitive 621 | description: 622 | name: stack_trace 623 | url: "https://pub.dartlang.org" 624 | source: hosted 625 | version: "1.10.0-nullsafety.1" 626 | stream_channel: 627 | dependency: transitive 628 | description: 629 | name: stream_channel 630 | url: "https://pub.dartlang.org" 631 | source: hosted 632 | version: "2.1.0-nullsafety.1" 633 | stream_transform: 634 | dependency: transitive 635 | description: 636 | name: stream_transform 637 | url: "https://pub.dartlang.org" 638 | source: hosted 639 | version: "1.2.0" 640 | string_scanner: 641 | dependency: transitive 642 | description: 643 | name: string_scanner 644 | url: "https://pub.dartlang.org" 645 | source: hosted 646 | version: "1.1.0-nullsafety.1" 647 | synchronized: 648 | dependency: transitive 649 | description: 650 | name: synchronized 651 | url: "https://pub.dartlang.org" 652 | source: hosted 653 | version: "2.2.0+2" 654 | term_glyph: 655 | dependency: transitive 656 | description: 657 | name: term_glyph 658 | url: "https://pub.dartlang.org" 659 | source: hosted 660 | version: "1.2.0-nullsafety.1" 661 | test_api: 662 | dependency: transitive 663 | description: 664 | name: test_api 665 | url: "https://pub.dartlang.org" 666 | source: hosted 667 | version: "0.2.19-nullsafety.2" 668 | timing: 669 | dependency: transitive 670 | description: 671 | name: timing 672 | url: "https://pub.dartlang.org" 673 | source: hosted 674 | version: "0.1.1+3" 675 | typed_data: 676 | dependency: transitive 677 | description: 678 | name: typed_data 679 | url: "https://pub.dartlang.org" 680 | source: hosted 681 | version: "1.3.0-nullsafety.3" 682 | uuid: 683 | dependency: transitive 684 | description: 685 | name: uuid 686 | url: "https://pub.dartlang.org" 687 | source: hosted 688 | version: "2.2.2" 689 | vector_math: 690 | dependency: transitive 691 | description: 692 | name: vector_math 693 | url: "https://pub.dartlang.org" 694 | source: hosted 695 | version: "2.1.0-nullsafety.3" 696 | watcher: 697 | dependency: transitive 698 | description: 699 | name: watcher 700 | url: "https://pub.dartlang.org" 701 | source: hosted 702 | version: "0.9.7+15" 703 | web_socket_channel: 704 | dependency: transitive 705 | description: 706 | name: web_socket_channel 707 | url: "https://pub.dartlang.org" 708 | source: hosted 709 | version: "1.1.0" 710 | win32: 711 | dependency: transitive 712 | description: 713 | name: win32 714 | url: "https://pub.dartlang.org" 715 | source: hosted 716 | version: "1.7.4" 717 | xdg_directories: 718 | dependency: transitive 719 | description: 720 | name: xdg_directories 721 | url: "https://pub.dartlang.org" 722 | source: hosted 723 | version: "0.1.2" 724 | xml: 725 | dependency: transitive 726 | description: 727 | name: xml 728 | url: "https://pub.dartlang.org" 729 | source: hosted 730 | version: "4.5.1" 731 | yaml: 732 | dependency: transitive 733 | description: 734 | name: yaml 735 | url: "https://pub.dartlang.org" 736 | source: hosted 737 | version: "2.2.1" 738 | sdks: 739 | dart: ">=2.10.2 <2.11.0" 740 | flutter: ">=1.22.2 <2.0.0" 741 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: task_app 2 | description: A new Flutter application. 3 | 4 | # The following line prevents the package from being accidentally published to 5 | # pub.dev using `pub publish`. This is preferred for private packages. 6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 7 | 8 | # The following defines the version and build number for your application. 9 | # A version number is three numbers separated by dots, like 1.2.43 10 | # followed by an optional build number separated by a +. 11 | # Both the version and the builder number may be overridden in flutter 12 | # build by specifying --build-name and --build-number, respectively. 13 | # In Android, build-name is used as versionName while build-number used as versionCode. 14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 16 | # Read more about iOS versioning at 17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 18 | version: 1.0.0+1 19 | 20 | environment: 21 | sdk: ">=2.7.0 <3.0.0" 22 | 23 | dependencies: 24 | flutter: 25 | sdk: flutter 26 | flutter_svg: ^0.19.1 27 | provider: ^3.0.0 28 | cached_network_image: ^2.4.1 29 | http: ^0.12.2 30 | json_annotation: ^3.1.1 31 | intl: ^0.16.1 32 | align_positioned: ^1.2.14 33 | dotted_border: ^1.0.7 34 | eva_icons_flutter: ^2.0.1 35 | shared_preferences: ^0.5.12+4 36 | 37 | # The following adds the Cupertino Icons font to your application. 38 | # Use with the CupertinoIcons class for iOS style icons. 39 | cupertino_icons: ^1.0.0 40 | 41 | dev_dependencies: 42 | flutter_test: 43 | sdk: flutter 44 | build_runner: ^1.0.0 45 | json_serializable: ^3.2.0 46 | 47 | # For information on the generic Dart part of this file, see the 48 | # following page: https://dart.dev/tools/pub/pubspec 49 | 50 | # The following section is specific to Flutter. 51 | flutter: 52 | 53 | # The following line ensures that the Material Icons font is 54 | # included with your application, so that you can use the icons in 55 | # the material Icons class. 56 | uses-material-design: true 57 | 58 | # To add assets to your application, add an assets section, like this: 59 | assets: 60 | - assets/images/ 61 | 62 | # An image asset can refer to one or more resolution-specific "variants", see 63 | # https://flutter.dev/assets-and-images/#resolution-aware. 64 | 65 | # For details regarding adding assets from package dependencies, see 66 | # https://flutter.dev/assets-and-images/#from-packages 67 | 68 | # To add custom fonts to your application, add a fonts section here, 69 | # in this "flutter" section. Each entry in this list should have a 70 | # "family" key with the font family name, and a "fonts" key with a 71 | # list giving the asset and other descriptors for the font. For 72 | # example: 73 | fonts: 74 | - family: Poppins 75 | fonts: 76 | - asset: assets/fonts/Poppins-Regular.ttf 77 | - asset: assets/fonts/Poppins-Medium.ttf 78 | weight: 500 79 | - family: Pacifico 80 | fonts: 81 | - asset: assets/fonts/Pacifico-Regular.ttf 82 | # 83 | # For details regarding fonts from package dependencies, 84 | # see https://flutter.dev/custom-fonts/#from-packages 85 | -------------------------------------------------------------------------------- /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:task_app/main.dart'; 12 | 13 | void main() { 14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 15 | // Build our app and trigger a frame. 16 | await tester.pumpWidget(MyApp()); 17 | 18 | // Verify that our counter starts at 0. 19 | expect(find.text('0'), findsOneWidget); 20 | expect(find.text('1'), findsNothing); 21 | 22 | // Tap the '+' icon and trigger a frame. 23 | await tester.tap(find.byIcon(Icons.add)); 24 | await tester.pump(); 25 | 26 | // Verify that our counter has incremented. 27 | expect(find.text('0'), findsNothing); 28 | expect(find.text('1'), findsOneWidget); 29 | }); 30 | } 31 | --------------------------------------------------------------------------------