├── android ├── settings_aar.gradle ├── app │ ├── src │ │ ├── main │ │ │ ├── ic_launcher-web.png │ │ │ ├── res │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ ├── tasks.png │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ ├── tasks.png │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ ├── tasks.png │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ ├── tasks.png │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ ├── tasks.png │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── values │ │ │ │ │ └── styles.xml │ │ │ │ └── drawable │ │ │ │ │ └── launch_background.xml │ │ │ ├── kotlin │ │ │ │ └── com │ │ │ │ │ └── example │ │ │ │ │ └── my_todo │ │ │ │ │ └── MainActivity.kt │ │ │ └── AndroidManifest.xml │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ └── profile │ │ │ └── AndroidManifest.xml │ └── build.gradle ├── gradle.properties ├── .gitignore ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── settings.gradle └── build.gradle ├── ios ├── Flutter │ ├── Debug.xcconfig │ ├── Release.xcconfig │ └── AppFrameworkInfo.plist ├── Runner │ ├── Runner-Bridging-Header.h │ ├── Assets.xcassets │ │ ├── LaunchImage.imageset │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ ├── README.md │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── Icon-App-83.5x83.5@2x.png │ │ │ └── Contents.json │ ├── AppDelegate.swift │ ├── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.storyboard │ └── Info.plist ├── Runner.xcworkspace │ └── contents.xcworkspacedata ├── Runner.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── Runner.xcscheme │ └── project.pbxproj └── .gitignore ├── .gitattributes ├── readme_assets ├── 1.jpg ├── 2.jpg ├── 3.jpg ├── 4.jpg ├── 5.jpg ├── 6.jpg └── ic_launcher.png ├── lib ├── values │ └── values.dart ├── screens │ ├── loading_screen.dart │ ├── new_user_screen.dart │ ├── todos_screen.dart │ └── todo_app.dart ├── models │ └── task.dart ├── main.dart ├── data │ └── storage.dart ├── widgets │ ├── new_task_dialog.dart │ ├── types_card.dart │ ├── new_type_dialog.dart │ └── new_all_task_dialog.dart └── providers │ ├── tasks.dart │ └── home.dart ├── .metadata ├── .gitignore ├── LICENSE ├── test └── widget_test.dart ├── README.md ├── pubspec.yaml └── pubspec.lock /android/settings_aar.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /readme_assets/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/readme_assets/1.jpg -------------------------------------------------------------------------------- /readme_assets/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/readme_assets/2.jpg -------------------------------------------------------------------------------- /readme_assets/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/readme_assets/3.jpg -------------------------------------------------------------------------------- /readme_assets/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/readme_assets/4.jpg -------------------------------------------------------------------------------- /readme_assets/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/readme_assets/5.jpg -------------------------------------------------------------------------------- /readme_assets/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/readme_assets/6.jpg -------------------------------------------------------------------------------- /readme_assets/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/readme_assets/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/tasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-hdpi/tasks.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/tasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-mdpi/tasks.png -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.enableR8=true 3 | android.useAndroidX=true 4 | android.enableJetifier=true 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/tasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-xhdpi/tasks.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/tasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-xxhdpi/tasks.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/tasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-xxxhdpi/tasks.png -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noobcoder17/my_todo/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /lib/values/values.dart: -------------------------------------------------------------------------------- 1 | List months = [ 2 | 'fuck you', 3 | 'january', 4 | 'february', 5 | 'march', 6 | 'april', 7 | 'may', 8 | 'june', 9 | 'july', 10 | 'august', 11 | 'september', 12 | 'october', 13 | 'november', 14 | 'december' 15 | ]; -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /lib/screens/loading_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class LoadingScreen extends StatelessWidget { 4 | @override 5 | Widget build(BuildContext context) { 6 | return Scaffold( 7 | body: Center( 8 | child: CircularProgressIndicator(), 9 | ), 10 | ); 11 | } 12 | } -------------------------------------------------------------------------------- /.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: 27321ebbad34b0a3fafe99fac037102196d655ff 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 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 | -------------------------------------------------------------------------------- /lib/models/task.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/foundation.dart'; 2 | 3 | class Task extends ChangeNotifier { 4 | String id; 5 | String name; 6 | String type; 7 | bool isDone; 8 | 9 | Task({ 10 | @required this.id, 11 | @required this.name, 12 | @required this.type, 13 | @required this.isDone, 14 | }); 15 | 16 | toJson(){ 17 | return { 18 | 'id' : id, 19 | 'name' : name, 20 | 'type' : type, 21 | 'isDone' : isDone, 22 | }; 23 | } 24 | } -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/my_todo/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.my_todo 2 | 3 | import androidx.annotation.NonNull; 4 | import io.flutter.embedding.android.FlutterActivity 5 | import io.flutter.embedding.engine.FlutterEngine 6 | import io.flutter.plugins.GeneratedPluginRegistrant 7 | 8 | class MainActivity: FlutterActivity() { 9 | override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { 10 | GeneratedPluginRegistrant.registerWith(flutterEngine); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() 4 | 5 | def plugins = new Properties() 6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') 7 | if (pluginsFile.exists()) { 8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } 9 | } 10 | 11 | plugins.each { name, path -> 12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() 13 | include ":$name" 14 | project(":$name").projectDir = pluginDirectory 15 | } 16 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | .dart_tool/ 26 | .flutter-plugins 27 | .flutter-plugins-dependencies 28 | .packages 29 | .pub-cache/ 30 | .pub/ 31 | /build/ 32 | 33 | # Web related 34 | lib/generated_plugin_registrant.dart 35 | 36 | # Exceptions to above rules. 37 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 38 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Akash Debnath 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility that Flutter provides. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | 11 | import 'package:my_todo/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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |
⭐ My ToDo ⭐
4 |

5 |

6 | Built with ❤︎ by 7 | Akash Debnath 8 |

9 |

This is my second project on Flutter. This app hepls you to keep record of your ToDos. You can create your own category and save todos in then.It also shows how many todos are left in a specific category.

10 | 11 |
12 |

In this project all the data are stored in External Storage Directory of the app in JSON format. I have used all Material Design. Only two packages are used - 1. Path Provider 2. Provider. Path Provider package is used to work with the local device storage and Provider package is used to handel State Management.

13 | 14 | 15 |

16 | 17 | 18 | 19 |

20 |

21 | 22 | 23 | 24 |

25 | -------------------------------------------------------------------------------- /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 | my_todo 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 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 8 | 12 | 19 | 22 | 23 | 24 | 25 | 26 | 27 | 29 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/services.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:provider/provider.dart'; 4 | 5 | 6 | //screens 7 | import './screens/new_user_screen.dart'; 8 | import './screens/loading_screen.dart'; 9 | import './screens/todo_app.dart'; 10 | import './screens/todos_screen.dart'; 11 | 12 | //providers 13 | import 'package:my_todo/providers/home.dart'; 14 | 15 | void main(){ 16 | SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle( 17 | statusBarColor: Colors.transparent, 18 | statusBarIconBrightness: Brightness.light, 19 | )); 20 | SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); 21 | runApp(MyApp()); 22 | } 23 | 24 | class MyApp extends StatelessWidget { 25 | @override 26 | Widget build(BuildContext context) { 27 | return MultiProvider( 28 | providers: [ 29 | ChangeNotifierProvider(create: (ctx)=>HomeProvider(),), 30 | ], 31 | child: Consumer( 32 | builder: (context,homeProvider,widget){ 33 | return MaterialApp( 34 | color: Colors.white, 35 | debugShowCheckedModeBanner: false, 36 | title: 'My ToDo', 37 | theme: ThemeData( 38 | primarySwatch: Colors.blue, 39 | ), 40 | home: homeProvider.isNewUser? ToDo() : FutureBuilder( 41 | future: homeProvider.tryToGetData(), 42 | builder: (context,result){ 43 | if(result.connectionState == ConnectionState.waiting){ 44 | return LoadingScreen(); 45 | }else{ 46 | return NewUserScreen(); 47 | } 48 | }, 49 | ), 50 | routes: { 51 | ToDosScreen.routeName:(ctx)=>ToDosScreen() 52 | }, 53 | ); 54 | }, 55 | ), 56 | ); 57 | } 58 | } -------------------------------------------------------------------------------- /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 28 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.example.my_todo" 42 | minSdkVersion 16 43 | targetSdkVersion 28 44 | versionCode flutterVersionCode.toInteger() 45 | versionName flutterVersionName 46 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 47 | } 48 | 49 | buildTypes { 50 | release { 51 | // TODO: Add your own signing config for the release build. 52 | // Signing with the debug keys for now, so `flutter run --release` works. 53 | signingConfig signingConfigs.debug 54 | } 55 | } 56 | } 57 | 58 | flutter { 59 | source '../..' 60 | } 61 | 62 | dependencies { 63 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 64 | testImplementation 'junit:junit:4.12' 65 | androidTestImplementation 'androidx.test:runner:1.1.1' 66 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' 67 | } 68 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /lib/data/storage.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | import 'dart:convert'; 3 | import 'package:path_provider/path_provider.dart'; 4 | 5 | class StoreData { 6 | Future storageDirPath() async { 7 | Directory directory = await getExternalStorageDirectory(); 8 | return directory.path; 9 | } 10 | 11 | Future getFile() async { 12 | String path = await storageDirPath(); 13 | return File('$path/data.json'); 14 | } 15 | 16 | Future fileExits() async { 17 | File file = await getFile(); 18 | return file.exists(); 19 | } 20 | 21 | Future createNewUserFile(Map newUserData) async { 22 | File file = await getFile(); 23 | bool isFileExits = await fileExits(); 24 | if(isFileExits){ 25 | //print("User file already exists"); 26 | return file; 27 | } 28 | return file.writeAsString(jsonEncode(newUserData)); 29 | } 30 | 31 | Future getData() async{ 32 | File file = await getFile(); 33 | return file.readAsString(); 34 | } 35 | 36 | Future addType(String newType) async { 37 | File dataFile = await getFile(); 38 | //print("Storing in existing file"); 39 | String prevJsonData = await getData(); 40 | Map data = jsonDecode(prevJsonData); 41 | data["types"].add(newType); 42 | data["tasks"].addAll({newType:{}}); 43 | return dataFile.writeAsString(jsonEncode(data)); 44 | } 45 | 46 | Future remoreType(String type) async { 47 | File dataFile = await getFile(); 48 | //print("Storing in existing file"); 49 | String prevJsonData = await getData(); 50 | Map data = jsonDecode(prevJsonData); 51 | data["types"].remove(type); 52 | data["tasks"].remove(type); 53 | return dataFile.writeAsString(jsonEncode(data)); 54 | } 55 | 56 | Future addTask(String type,Map newJsonData) async { 57 | File dataFile = await getFile(); 58 | //print("Storing in existing file"); 59 | String prevJsonData = await getData(); 60 | Map data = jsonDecode(prevJsonData); 61 | data["tasks"][type].addAll(newJsonData); 62 | return dataFile.writeAsString(jsonEncode(data)); 63 | } 64 | 65 | Future updateTask(String type,String key,Map newJsonData) async { 66 | File dataFile = await getFile(); 67 | String prevJsonData = await getData(); 68 | Map data = jsonDecode(prevJsonData); 69 | data['tasks'][type].update(key,(dynamic value){return newJsonData[key];},ifAbsent: (){return newJsonData[key];}); 70 | return dataFile.writeAsString(jsonEncode(data)); 71 | } 72 | 73 | Future deleteTask(String type,String id) async{ 74 | File dataFile = await getFile(); 75 | String prevJsonData = await getData(); 76 | Map data = jsonDecode(prevJsonData); 77 | data['tasks'][type].remove(id); 78 | return dataFile.writeAsString(jsonEncode(data)); 79 | } 80 | } -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: my_todo 2 | description: A new Flutter project. 3 | 4 | # The following defines the version and build number for your application. 5 | # A version number is three numbers separated by dots, like 1.2.43 6 | # followed by an optional build number separated by a +. 7 | # Both the version and the builder number may be overridden in flutter 8 | # build by specifying --build-name and --build-number, respectively. 9 | # In Android, build-name is used as versionName while build-number used as versionCode. 10 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 11 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 12 | # Read more about iOS versioning at 13 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 14 | version: 1.0.0 15 | 16 | environment: 17 | sdk: ">=2.2.2 <3.0.0" 18 | 19 | dependencies: 20 | flutter: 21 | sdk: flutter 22 | 23 | # The following adds the Cupertino Icons font to your application. 24 | # Use with the CupertinoIcons class for iOS style icons. 25 | cupertino_icons: ^0.1.2 26 | 27 | provider: ^3.2.0 28 | path_provider: ^1.5.1 29 | google_fonts: ^0.2.0 30 | 31 | dev_dependencies: 32 | flutter_test: 33 | sdk: flutter 34 | 35 | 36 | # For information on the generic Dart part of this file, see the 37 | # following page: https://dart.dev/tools/pub/pubspec 38 | 39 | # The following section is specific to Flutter. 40 | flutter: 41 | 42 | # The following line ensures that the Material Icons font is 43 | # included with your application, so that you can use the icons in 44 | # the material Icons class. 45 | uses-material-design: true 46 | 47 | # To add assets to your application, add an assets section, like this: 48 | # assets: 49 | # - images/a_dot_burr.jpeg 50 | # - images/a_dot_ham.jpeg 51 | 52 | # An image asset can refer to one or more resolution-specific "variants", see 53 | # https://flutter.dev/assets-and-images/#resolution-aware. 54 | 55 | # For details regarding adding assets from package dependencies, see 56 | # https://flutter.dev/assets-and-images/#from-packages 57 | 58 | # To add custom fonts to your application, add a fonts section here, 59 | # in this "flutter" section. Each entry in this list should have a 60 | # "family" key with the font family name, and a "fonts" key with a 61 | # list giving the asset and other descriptors for the font. For 62 | # example: 63 | # fonts: 64 | # - family: Schyler 65 | # fonts: 66 | # - asset: fonts/Schyler-Regular.ttf 67 | # - asset: fonts/Schyler-Italic.ttf 68 | # style: italic 69 | # - family: Trajan Pro 70 | # fonts: 71 | # - asset: fonts/TrajanPro.ttf 72 | # - asset: fonts/TrajanPro_Bold.ttf 73 | # weight: 700 74 | # 75 | # For details regarding fonts from package dependencies, 76 | # see https://flutter.dev/custom-fonts/#from-packages 77 | -------------------------------------------------------------------------------- /lib/widgets/new_task_dialog.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:google_fonts/google_fonts.dart'; 3 | 4 | import '../providers/tasks.dart'; 5 | 6 | 7 | class NewTaskDialog extends StatefulWidget { 8 | final TasksProvider tasksProvider; 9 | 10 | NewTaskDialog({ 11 | this.tasksProvider 12 | }); 13 | 14 | @override 15 | _NewTaskDialogState createState() => _NewTaskDialogState(); 16 | } 17 | 18 | class _NewTaskDialogState extends State { 19 | final _form = GlobalKey(); 20 | bool _isLoading = false; 21 | String _taskName; 22 | 23 | 24 | Future _onSubmit() async{ 25 | final isValid = _form.currentState.validate(); 26 | if (!isValid) { 27 | return; 28 | } 29 | _form.currentState.save(); 30 | setState(() { 31 | _isLoading = true; 32 | }); 33 | try{ 34 | bool success = await widget.tasksProvider.addIndividualTask(_taskName); 35 | if(success){ 36 | //print("Add Dialog success, popping off"); 37 | } 38 | }catch(e){ 39 | //print(e); 40 | } 41 | setState(() { 42 | _isLoading = false; 43 | }); 44 | Navigator.of(context).pop(); 45 | } 46 | 47 | @override 48 | Widget build(BuildContext context) { 49 | return AlertDialog( 50 | shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), 51 | title: Text("Add new Todo",style:GoogleFonts.poppins(textStyle: TextStyle(fontWeight: FontWeight.w500,fontSize: 20))), 52 | content: Column( 53 | mainAxisSize: MainAxisSize.min, 54 | children: [ 55 | Form( 56 | key: _form, 57 | child: TextFormField( 58 | decoration: InputDecoration( 59 | border: OutlineInputBorder(), 60 | hintText: "Todo name", 61 | ), 62 | autocorrect: true, 63 | keyboardType: TextInputType.text, 64 | textCapitalization: TextCapitalization.sentences, 65 | validator: (value){ 66 | if (value.isEmpty) { 67 | return 'Please provide a value.'; 68 | } 69 | return null; 70 | }, 71 | onChanged: (value){ 72 | setState(() { 73 | _taskName = value; 74 | }); 75 | }, 76 | onFieldSubmitted: (value){ 77 | _onSubmit(); 78 | }, 79 | ), 80 | ) 81 | ], 82 | ), 83 | actions: [ 84 | FlatButton( 85 | child: Text("Cancel",style: GoogleFonts.poppins(textStyle: TextStyle(fontWeight: FontWeight.w500))), 86 | onPressed: (){ 87 | Navigator.of(context).pop(); 88 | }, 89 | ), 90 | FlatButton( 91 | child: _isLoading ? CircularProgressIndicator() : Text("Add",style: GoogleFonts.poppins(textStyle: TextStyle(fontWeight: FontWeight.w500)),), 92 | onPressed: (){ 93 | _onSubmit(); 94 | }, 95 | ), 96 | ], 97 | ); 98 | } 99 | } -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /lib/widgets/types_card.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:google_fonts/google_fonts.dart'; 3 | 4 | 5 | //providers 6 | import '../providers/tasks.dart'; 7 | 8 | //screen 9 | import '../screens/todos_screen.dart'; 10 | 11 | class TypesCard extends StatefulWidget { 12 | final double height; 13 | final double width; 14 | final String type; 15 | final int done; 16 | final int total; 17 | final Function deleteFunction; 18 | final TasksProvider tasksProvider; 19 | 20 | const TypesCard({ 21 | Key key, 22 | this.height, 23 | this.width, 24 | this.type, 25 | this.done, 26 | this.total, 27 | this.deleteFunction, 28 | this.tasksProvider 29 | }) : super(key: key); 30 | 31 | 32 | @override 33 | _TypesCardState createState() => _TypesCardState(); 34 | } 35 | 36 | class _TypesCardState extends State { 37 | final TextStyle style = GoogleFonts.poppins(textStyle: TextStyle(fontSize: 17,color: Colors.black)); 38 | @override 39 | Widget build(BuildContext context) { 40 | int left = widget.total - widget.done; 41 | return GestureDetector( 42 | onTap: (){ 43 | Navigator.of(context).pushNamed(ToDosScreen.routeName,arguments:widget.tasksProvider); 44 | }, 45 | child: Container( 46 | padding: EdgeInsets.fromLTRB(20, 20, 20, 40), 47 | margin: const EdgeInsets.symmetric(horizontal: 10,vertical: 15), 48 | height: widget.width*0.75*1.2, 49 | width: widget.width*0.75, 50 | decoration: BoxDecoration( 51 | color: Colors.white, 52 | borderRadius: BorderRadius.circular(10), 53 | boxShadow: [ 54 | BoxShadow( 55 | color: Colors.black12, 56 | offset: Offset(0,6), 57 | blurRadius: 4, 58 | spreadRadius: 3 59 | ) 60 | ] 61 | ), 62 | child: Column( 63 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 64 | children: [ 65 | Row( 66 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 67 | children: [ 68 | Text("${widget.type}".toUpperCase(),style: GoogleFonts.poppins(textStyle: TextStyle(fontSize: 25,color: Colors.black)),), 69 | IconButton( 70 | icon: Icon(Icons.delete,size: 21,color: Colors.redAccent,), 71 | onPressed: (){ 72 | widget.deleteFunction(widget.type); 73 | } 74 | ) 75 | ], 76 | ), 77 | Column( 78 | crossAxisAlignment: CrossAxisAlignment.start, 79 | children: [ 80 | left==0? Text("All Todos done",style: style,): left==1? 81 | Text("You have $left Todo",style: style,): Text("You have $left Todos",style: style,) , 82 | SizedBox(height: 20,), 83 | LinearProgressIndicator( 84 | value: widget.total==0? 1 : widget.done==0? 0 : (widget.done/widget.total).toDouble(), 85 | ) 86 | ], 87 | ) 88 | //Text("${widget.total}"), 89 | ], 90 | ), 91 | ), 92 | ); 93 | } 94 | } -------------------------------------------------------------------------------- /lib/widgets/new_type_dialog.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:google_fonts/google_fonts.dart'; 3 | import 'package:provider/provider.dart'; 4 | 5 | //providers 6 | import '../providers/home.dart'; 7 | 8 | 9 | class NewTypeDialog extends StatefulWidget { 10 | @override 11 | _NewTypeDialogState createState() => _NewTypeDialogState(); 12 | } 13 | 14 | class _NewTypeDialogState extends State { 15 | final _form = GlobalKey(); 16 | List _types; 17 | String _type; 18 | bool _isLoading = false; 19 | 20 | void initState(){ 21 | super.initState(); 22 | _types = Provider.of(context,listen: false).getTypes; 23 | } 24 | 25 | bool alreadyExists(String type){ 26 | int index = _types.indexOf(type.toLowerCase()); 27 | if(index==-1){ 28 | return false; 29 | } 30 | return true; 31 | } 32 | 33 | Future _onSubmit() async{ 34 | final isValid = _form.currentState.validate(); 35 | if (!isValid) { 36 | return; 37 | } 38 | _form.currentState.save(); 39 | setState(() { 40 | _isLoading = true; 41 | }); 42 | try{ 43 | bool success = await Provider.of(context).addType(_type.toLowerCase()); 44 | if(success){ 45 | //print("Add Dialog success, popping off"); 46 | } 47 | }catch(e){ 48 | //print(e); 49 | } 50 | setState(() { 51 | _isLoading = false; 52 | }); 53 | Navigator.of(context).pop(); 54 | } 55 | 56 | @override 57 | Widget build(BuildContext context) { 58 | return AlertDialog( 59 | shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), 60 | title: Text("Add new type of ToDo",style:GoogleFonts.poppins(textStyle: TextStyle(fontWeight: FontWeight.w500,fontSize: 20))), 61 | content: Column( 62 | mainAxisSize: MainAxisSize.min, 63 | children: [ 64 | Form( 65 | key: _form, 66 | child: TextFormField( 67 | decoration: InputDecoration( 68 | border: OutlineInputBorder(), 69 | hintText: "Type name", 70 | ), 71 | autocorrect: true, 72 | keyboardType: TextInputType.text, 73 | textCapitalization: TextCapitalization.sentences, 74 | validator: (value){ 75 | if (value.isEmpty) { 76 | return 'Please provide a value.'; 77 | } 78 | if(alreadyExists(value)){ 79 | return 'Type Already exists.'; 80 | } 81 | return null; 82 | }, 83 | onChanged: (value){ 84 | setState(() { 85 | _type = value; 86 | }); 87 | }, 88 | onFieldSubmitted: (value){ 89 | _onSubmit(); 90 | }, 91 | ), 92 | ) 93 | ], 94 | ), 95 | actions: [ 96 | FlatButton( 97 | child: Text("Cancel",style: GoogleFonts.poppins(textStyle: TextStyle(fontWeight: FontWeight.w500))), 98 | onPressed: (){ 99 | Navigator.of(context).pop(); 100 | }, 101 | ), 102 | FlatButton( 103 | child: _isLoading ? CircularProgressIndicator() : Text("Add",style: GoogleFonts.poppins(textStyle: TextStyle(fontWeight: FontWeight.w500)),), 104 | onPressed: (){ 105 | _onSubmit(); 106 | }, 107 | ), 108 | ], 109 | ); 110 | } 111 | } -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /lib/providers/tasks.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | import 'package:flutter/foundation.dart'; 3 | import '../models/task.dart'; 4 | 5 | import '../data/storage.dart' ; 6 | 7 | class TasksProvider extends ChangeNotifier { 8 | StoreData storage = new StoreData(); 9 | String _type; 10 | List _tasks = []; 11 | 12 | TasksProvider(String type,Map tasks){ 13 | _type = type; 14 | Task tempTask; 15 | List tempList = []; 16 | tasks.forEach((key,data){ 17 | tempTask = new Task( 18 | id: data['id'].toString(), 19 | name: data['name'].toString(), 20 | type: data['type'].toString(), 21 | isDone: data['isDone'] 22 | ); 23 | tempList.add(tempTask); 24 | }); 25 | _tasks = tempList; 26 | } 27 | 28 | String get getType{ 29 | return _type; 30 | } 31 | 32 | int get getTotalDone { 33 | int _tempDone = 0; 34 | _tasks.forEach((task){ 35 | if(task.isDone){ 36 | _tempDone +=1; 37 | } 38 | }); 39 | return _tempDone; 40 | } 41 | 42 | int get getTotalTask { 43 | return _tasks.length; 44 | } 45 | 46 | List get getTasks{ 47 | return [..._tasks]; 48 | } 49 | 50 | Future addTask(Task newTask) async { 51 | Map newJsonData = { 52 | newTask.id : newTask.toJson() 53 | }; 54 | try { 55 | File success = await storage.addTask(_type,newJsonData); 56 | if(success!=null){ 57 | _tasks.add(newTask); 58 | //print("Task added in individual provider"); 59 | notifyListeners(); 60 | return true; 61 | } 62 | }catch(e){ 63 | //print("Task adding failed"); 64 | //print(e); 65 | return false; 66 | } 67 | return false; 68 | } 69 | 70 | Future addIndividualTask(String taskName) async { 71 | Task newTask = new Task( 72 | id: DateTime.now().toString(), 73 | name: taskName, 74 | type: _type, 75 | isDone: false 76 | ); 77 | 78 | Map newJsonData = { 79 | newTask.id : newTask.toJson() 80 | }; 81 | try { 82 | File success = await storage.addTask(_type,newJsonData); 83 | if(success!=null){ 84 | _tasks.add(newTask); 85 | //print("Task added in provider"); 86 | notifyListeners(); 87 | return true; 88 | } 89 | }catch(e){ 90 | //print("Task adding failed"); 91 | //print(e); 92 | return false; 93 | } 94 | return false; 95 | } 96 | 97 | Future removeTask(String id) async { 98 | try{ 99 | await storage.deleteTask(_type,id); 100 | //print("task deleted"); 101 | _tasks.removeWhere((task)=>task.id==id); 102 | notifyListeners(); 103 | }catch(e){ 104 | //print(e); 105 | } 106 | } 107 | 108 | Future updateTask(Task task) async { 109 | try{ 110 | StoreData storage = new StoreData(); 111 | Map newJsonData = { 112 | task.id : task.toJson() 113 | }; 114 | File success = await storage.updateTask(_type,task.id,newJsonData); 115 | if(success!=null){ 116 | return true; 117 | } 118 | }catch(e){ 119 | //print(e); 120 | return false; 121 | } 122 | return true; 123 | } 124 | 125 | Future toggleDone(String id) async { 126 | int index = _tasks.indexWhere((task)=>task.id==id); 127 | try{ 128 | Task tempTask = _tasks[index]; 129 | tempTask.isDone = !tempTask.isDone; 130 | bool updateSuccess = await updateTask(tempTask); 131 | if(updateSuccess){ 132 | //_tasks[index].isDone = !_tasks[index].isDone; 133 | //print("$id Task done updated"); 134 | notifyListeners(); 135 | }else{ 136 | throw updateSuccess; 137 | } 138 | }catch(e){ 139 | //print("$id Task done update failed"); 140 | } 141 | notifyListeners(); 142 | } 143 | } -------------------------------------------------------------------------------- /lib/screens/new_user_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:google_fonts/google_fonts.dart'; 3 | import 'package:provider/provider.dart'; 4 | import 'package:flutter/services.dart'; 5 | 6 | //providers 7 | import 'package:my_todo/providers/home.dart'; 8 | 9 | //screen 10 | 11 | class NewUserScreen extends StatefulWidget { 12 | 13 | @override 14 | _NewUserScreenState createState() => _NewUserScreenState(); 15 | } 16 | 17 | class _NewUserScreenState extends State { 18 | final _form = GlobalKey(); 19 | bool _isLoading = false; 20 | String _userName; 21 | 22 | void _createUser() async { 23 | final isValid = _form.currentState.validate(); 24 | if (!isValid) { 25 | return; 26 | } 27 | _form.currentState.save(); 28 | setState(() { 29 | _isLoading = true; 30 | }); 31 | try { 32 | bool isCreated = await Provider.of(context).createNewUserData(_userName); 33 | if(isCreated){ 34 | //print("New User Created"); 35 | //Navigator.of(context).pushReplacementNamed(ToDo.routeName); 36 | }else{ 37 | showDialog( 38 | context: context, 39 | builder: (ctx){ 40 | return AlertDialog(); 41 | } 42 | ); 43 | } 44 | }catch(e){ 45 | //print(e); 46 | } 47 | setState(() { 48 | _isLoading = false; 49 | }); 50 | } 51 | 52 | @override 53 | Widget build(BuildContext context) { 54 | SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle( 55 | statusBarColor: Colors.transparent, 56 | statusBarIconBrightness: Brightness.dark, 57 | )); 58 | return Scaffold( 59 | body: Center( 60 | child: Padding( 61 | padding: const EdgeInsets.only(top: 100,left: 40,right: 40,bottom: 50), 62 | child: Column( 63 | crossAxisAlignment: CrossAxisAlignment.start, 64 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 65 | children: [ 66 | RichText( 67 | text: TextSpan( 68 | children: [ 69 | TextSpan(text: "Hello,\n",style: GoogleFonts.poppins(textStyle: TextStyle(color:Colors.blue,fontSize: 25,fontWeight: FontWeight.w600))), 70 | TextSpan(text: "Les't get some work done,\n",style: GoogleFonts.poppins(textStyle: TextStyle(color:Colors.blue))), 71 | ] 72 | ), 73 | ), 74 | Column( 75 | mainAxisSize: MainAxisSize.min, 76 | crossAxisAlignment: CrossAxisAlignment.center, 77 | mainAxisAlignment: MainAxisAlignment.spaceAround, 78 | children: [ 79 | Form( 80 | key: _form, 81 | child: TextFormField( 82 | decoration: InputDecoration( 83 | border: OutlineInputBorder(), 84 | hintText: "Enter your name" 85 | ), 86 | autocorrect: true, 87 | keyboardType: TextInputType.text, 88 | textCapitalization: TextCapitalization.sentences, 89 | validator: (value){ 90 | if (value.isEmpty) { 91 | return 'Please provide a value.'; 92 | } 93 | return null; 94 | }, 95 | onChanged: (value){ 96 | setState(() { 97 | _userName = value; 98 | }); 99 | }, 100 | ), 101 | ), 102 | SizedBox(height: 20,), 103 | RaisedButton( 104 | color: Colors.blue, 105 | child: _isLoading ? CircularProgressIndicator() : 106 | Text("Create Account",style: GoogleFonts.poppins(textStyle: TextStyle(color: Colors.white),)), 107 | onPressed: () { 108 | _createUser(); 109 | }, 110 | ), 111 | ], 112 | ), 113 | ], 114 | ), 115 | ), 116 | ) 117 | ); 118 | } 119 | } -------------------------------------------------------------------------------- /lib/widgets/new_all_task_dialog.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:google_fonts/google_fonts.dart'; 3 | import 'package:provider/provider.dart'; 4 | 5 | //providers 6 | import '../providers/home.dart'; 7 | 8 | 9 | class NewAllTaskDialog extends StatefulWidget { 10 | @override 11 | _NewAllTaskDialogState createState() => _NewAllTaskDialogState(); 12 | } 13 | 14 | class _NewAllTaskDialogState extends State { 15 | 16 | final _form = GlobalKey(); 17 | String _type; 18 | String _taskName; 19 | bool _isLoading = false; 20 | 21 | @override 22 | void initState(){ 23 | super.initState(); 24 | _type = Provider.of(context,listen: false).getTypes[0]; 25 | } 26 | 27 | Future _onSubmit() async{ 28 | final isValid = _form.currentState.validate(); 29 | if (!isValid) { 30 | return; 31 | } 32 | _form.currentState.save(); 33 | setState(() { 34 | _isLoading = true; 35 | }); 36 | try{ 37 | bool success = await Provider.of(context).addTaskFromHome(_type, _taskName); 38 | if(success){ 39 | //print("Add all task Dialog success, popping off"); 40 | } 41 | }catch(e){ 42 | //print(e); 43 | } 44 | setState(() { 45 | _isLoading = false; 46 | }); 47 | Navigator.of(context).pop(); 48 | } 49 | 50 | @override 51 | Widget build(BuildContext context) { 52 | List _types = Provider.of(context).getTypes; 53 | List> _items = []; 54 | _types.forEach((type){ 55 | DropdownMenuItem item = new DropdownMenuItem( 56 | value: type.toString(), 57 | child: Text("$type".toUpperCase()), 58 | ); 59 | _items.add(item); 60 | }); 61 | return AlertDialog( 62 | shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), 63 | title: Text("Add new Todo",style:GoogleFonts.poppins(textStyle: TextStyle(fontWeight: FontWeight.w500,fontSize: 20))), 64 | content: Column( 65 | mainAxisSize: MainAxisSize.min, 66 | children: [ 67 | Form( 68 | key: _form, 69 | child: Column( 70 | mainAxisSize: MainAxisSize.min, 71 | children: [ 72 | TextFormField( 73 | decoration: InputDecoration( 74 | hintText: "Todo name", 75 | border: OutlineInputBorder() 76 | ), 77 | autocorrect: true, 78 | keyboardType: TextInputType.text, 79 | textCapitalization: TextCapitalization.sentences, 80 | validator: (value){ 81 | if (value.isEmpty) { 82 | return 'Please provide a value.'; 83 | } 84 | return null; 85 | }, 86 | onFieldSubmitted: (value){ 87 | setState(() { 88 | _taskName= value; 89 | }); 90 | }, 91 | ), 92 | SizedBox(height: 15,), 93 | DropdownButtonFormField( 94 | decoration: InputDecoration( 95 | border: OutlineInputBorder( 96 | gapPadding: 0 97 | ) 98 | ), 99 | value: _type, 100 | items: _items, 101 | onChanged: (val){ 102 | setState(() { 103 | _type = val; 104 | }); 105 | }, 106 | ), 107 | ], 108 | ), 109 | ) 110 | ], 111 | ), 112 | actions: [ 113 | FlatButton( 114 | child: Text("Cancel",style: GoogleFonts.poppins(textStyle: TextStyle(fontWeight: FontWeight.w500))), 115 | onPressed: (){ 116 | Navigator.of(context).pop(); 117 | }, 118 | ), 119 | FlatButton( 120 | child: _isLoading ? CircularProgressIndicator() : Text("Add",style: GoogleFonts.poppins(textStyle: TextStyle(fontWeight: FontWeight.w500)),), 121 | onPressed: (){ 122 | _onSubmit(); 123 | }, 124 | ), 125 | ], 126 | ); 127 | } 128 | } -------------------------------------------------------------------------------- /lib/screens/todos_screen.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:google_fonts/google_fonts.dart'; 3 | import 'package:provider/provider.dart'; 4 | 5 | //providers 6 | import '../providers/tasks.dart'; 7 | 8 | //widgets 9 | import '../widgets/new_task_dialog.dart'; 10 | 11 | 12 | class ToDosScreen extends StatefulWidget { 13 | static const routeName = '/todos-screen'; 14 | @override 15 | _ToDosScreenState createState() => _ToDosScreenState(); 16 | } 17 | 18 | class _ToDosScreenState extends State { 19 | @override 20 | Widget build(BuildContext context) { 21 | TasksProvider tasksProvider = ModalRoute.of(context).settings.arguments as TasksProvider; 22 | return ChangeNotifierProvider.value( 23 | value: tasksProvider, 24 | child: Consumer( 25 | builder:(ctx,tasks,_){ 26 | return Scaffold( 27 | appBar: AppBar( 28 | centerTitle: true, 29 | title: Text(tasksProvider.getType.toUpperCase(),style: GoogleFonts.poppins(textStyle: TextStyle(fontSize: 20,fontWeight: FontWeight.w500)),), 30 | bottom: CustomAppBar( 31 | done: tasks.getTotalDone, 32 | total: tasks.getTotalTask, 33 | ), 34 | actions: [ 35 | IconButton( 36 | icon: Icon(Icons.add_circle_outline,color: Colors.white,), 37 | onPressed: (){ 38 | showDialog( 39 | context: context, 40 | builder: (context){ 41 | return NewTaskDialog(tasksProvider: tasksProvider,); 42 | } 43 | ); 44 | }, 45 | ), 46 | ], 47 | ), 48 | body: ListView.builder( 49 | itemCount: tasks.getTotalTask, 50 | itemBuilder: (ctx,i){ 51 | return ListTile( 52 | leading: Checkbox( 53 | value: tasks.getTasks[i].isDone, 54 | onChanged: (value){ 55 | tasksProvider.toggleDone(tasks.getTasks[i].id); 56 | }, 57 | ), 58 | title: Text(tasks.getTasks[i].name,style: GoogleFonts.poppins(textStyle: TextStyle(decoration: tasks.getTasks[i].isDone ? TextDecoration.lineThrough : null, color: tasks.getTasks[i].isDone ?Colors.grey :Colors.black )),), 59 | trailing: tasks.getTasks[i].isDone ? IconButton( 60 | icon: Icon(Icons.delete,size: 22,color: Colors.redAccent,), 61 | onPressed: (){ 62 | tasksProvider.removeTask(tasks.getTasks[i].id); 63 | }, 64 | ) : null, 65 | ); 66 | }, 67 | ), 68 | ); 69 | } 70 | ) 71 | ); 72 | } 73 | } 74 | 75 | 76 | class CustomAppBar extends StatelessWidget with PreferredSizeWidget { 77 | final int done; 78 | final int total; 79 | CustomAppBar({ 80 | this.done, 81 | this.total, 82 | }); 83 | final size = AppBar().preferredSize*1.5; 84 | final TextStyle style = GoogleFonts.poppins(textStyle: TextStyle(fontSize: 17,color: Colors.white)); 85 | @override 86 | Widget build(BuildContext context) { 87 | int left = total-done; 88 | return Container( 89 | padding: EdgeInsets.only(left: 30,right: 20), 90 | height: size.height, 91 | width: AppBar().preferredSize.width, 92 | child: 93 | Column( 94 | mainAxisSize: MainAxisSize.min, 95 | mainAxisAlignment: MainAxisAlignment.start, 96 | crossAxisAlignment: CrossAxisAlignment.start, 97 | children: [ 98 | left==0? Text("All Todos done",style: style,): left==1? 99 | Text("You have $left Todo",style: style,): Text("You have $left Todos",style: style,) , 100 | SizedBox(height: 20,), 101 | LinearProgressIndicator( 102 | //backgroundColor: Colors.white30, 103 | valueColor: AlwaysStoppedAnimation(Colors.white), 104 | value: total==0? 1 : done==0? 0 : (done/total).toDouble(), 105 | ) 106 | ], 107 | ), 108 | ); 109 | } 110 | 111 | @override 112 | Size get preferredSize => size; 113 | } 114 | 115 | 116 | 117 | 118 | 119 | 120 | // ListTile( 121 | // leading: Checkbox( 122 | // value: tasks[i].isDone, 123 | // onChanged: (value){ 124 | // tasks[i].toggleDone(); 125 | // }, 126 | // ), 127 | // title: Text(tasks[i].name,style: TextStyle(decoration: tasks[i].isDone ? TextDecoration.lineThrough : null),), 128 | // trailing: tasks[i].isDone ? IconButton( 129 | // icon: Icon(Icons.delete), 130 | // onPressed: (){}, 131 | // ) : null, 132 | // ); -------------------------------------------------------------------------------- /lib/providers/home.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | import 'dart:convert'; 3 | import 'package:flutter/foundation.dart'; 4 | import '../data/storage.dart'; 5 | 6 | 7 | //models 8 | import '../models/task.dart'; 9 | import './tasks.dart'; 10 | 11 | class HomeProvider extends ChangeNotifier { 12 | StoreData storage = new StoreData(); 13 | 14 | 15 | bool _isNewUser; 16 | String _userName; 17 | List _types = []; 18 | Map _taskProviders = {}; 19 | 20 | bool get isNewUser { 21 | return _isNewUser!=null; 22 | } 23 | 24 | String get getUserName { 25 | return _userName; 26 | } 27 | 28 | List get getTypes{ 29 | return [..._types]; 30 | } 31 | 32 | List get getTaskProviders { 33 | List tempList = []; 34 | _taskProviders.forEach((type,taskProvider){ 35 | tempList.add(taskProvider); 36 | }); 37 | return tempList; 38 | } 39 | 40 | Future addTaskFromHome(String type,String taskName) async { 41 | Task newTask = new Task( 42 | id: DateTime.now().toString(), 43 | name: taskName, 44 | type: type, 45 | isDone: false 46 | ); 47 | TasksProvider tasksProvider = _taskProviders[type]; 48 | try { 49 | bool success = await tasksProvider.addTask(newTask); 50 | if(success){ 51 | //print("Task added from home"); 52 | return true; 53 | }else{ 54 | return false; 55 | } 56 | }catch(e){ 57 | //print("Task adding failed"); 58 | //print(e); 59 | return false; 60 | } 61 | } 62 | 63 | Future addType(String type) async{ 64 | int isAlready = _types.indexOf(type); 65 | if(isAlready>=0){ 66 | return true; 67 | } 68 | try { 69 | File newFile = await storage.addType(type); 70 | if(newFile!=null){ 71 | //print("$type Type added"); 72 | _types.add(type); 73 | TasksProvider _newTasksProvider = TasksProvider(type,{}); 74 | _taskProviders.addAll({type:_newTasksProvider}); 75 | notifyListeners(); 76 | return true; 77 | } 78 | }catch(e){ 79 | //print("Type adding failed"); 80 | //print(e); 81 | return false; 82 | } 83 | return false; 84 | } 85 | 86 | Future deleteType(String type) async { 87 | try{ 88 | File success = await storage.remoreType(type); 89 | if(success!=null){ 90 | _taskProviders.remove(type); 91 | _types.remove(type); 92 | //print("Type remove successful"); 93 | notifyListeners(); 94 | return true; 95 | }else{ 96 | return false; 97 | } 98 | }catch(e){ 99 | //print("Type remove failed"); 100 | //print(e); 101 | return false; 102 | } 103 | } 104 | 105 | 106 | Future initializeAllData() async { 107 | try{ 108 | bool doesFileExits = await storage.fileExits(); 109 | if(doesFileExits){ 110 | String jsonData = await storage.getData(); 111 | Map data = jsonDecode(jsonData); 112 | 113 | //assigning data 114 | _userName = data['userName']; 115 | List tempTypes = []; 116 | data['types'].forEach((dynamic type){ 117 | tempTypes.add(type.toString()); 118 | }); 119 | _types = tempTypes; 120 | Map tempList = {}; 121 | _types.forEach((type){ 122 | //print("type:$type"); 123 | Map _eachType = data['tasks'][type]; 124 | TasksProvider _newTasksProvider = TasksProvider(type,_eachType); 125 | tempList.addAll({type:_newTasksProvider}); 126 | }); 127 | _taskProviders = tempList; 128 | } 129 | //print("All initializatiion done"); 130 | notifyListeners(); 131 | }catch(e){ 132 | //print("Initializatiion failed"); 133 | //print(e); 134 | } 135 | } 136 | 137 | 138 | Future createNewUserData(String userName) async { 139 | Map newUserData = { 140 | "userName" : userName, 141 | "types" : ["common"], 142 | "tasks" : { 143 | "common" : { 144 | DateTime.now().toString() : Task(id: DateTime.now().toString(),type: "common",name: "Common Task 1",isDone: false) 145 | } 146 | } 147 | }; 148 | try{ 149 | File success = await storage.createNewUserFile(newUserData); 150 | if(success!=null){ 151 | //print("New User Created"); 152 | _isNewUser = true; 153 | notifyListeners(); 154 | return true; 155 | } 156 | }catch(e){ 157 | //print(e); 158 | //print("New User Creation failed"); 159 | return false; 160 | } 161 | return false; 162 | } 163 | 164 | Future tryToGetData() async { 165 | bool doesUserExists = await storage.fileExits(); 166 | if(doesUserExists==false){ 167 | return false; 168 | } 169 | _isNewUser = true; 170 | notifyListeners(); 171 | return true; 172 | } 173 | } -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | archive: 5 | dependency: transitive 6 | description: 7 | name: archive 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "2.0.11" 11 | args: 12 | dependency: transitive 13 | description: 14 | name: args 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "1.5.2" 18 | async: 19 | dependency: transitive 20 | description: 21 | name: async 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "2.4.0" 25 | boolean_selector: 26 | dependency: transitive 27 | description: 28 | name: boolean_selector 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "1.0.5" 32 | charcode: 33 | dependency: transitive 34 | description: 35 | name: charcode 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "1.1.2" 39 | collection: 40 | dependency: transitive 41 | description: 42 | name: collection 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "1.14.11" 46 | convert: 47 | dependency: transitive 48 | description: 49 | name: convert 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "2.1.1" 53 | crypto: 54 | dependency: transitive 55 | description: 56 | name: crypto 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "2.1.3" 60 | cupertino_icons: 61 | dependency: "direct main" 62 | description: 63 | name: cupertino_icons 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "0.1.3" 67 | flutter: 68 | dependency: "direct main" 69 | description: flutter 70 | source: sdk 71 | version: "0.0.0" 72 | flutter_test: 73 | dependency: "direct dev" 74 | description: flutter 75 | source: sdk 76 | version: "0.0.0" 77 | google_fonts: 78 | dependency: "direct main" 79 | description: 80 | name: google_fonts 81 | url: "https://pub.dartlang.org" 82 | source: hosted 83 | version: "0.2.0" 84 | http: 85 | dependency: transitive 86 | description: 87 | name: http 88 | url: "https://pub.dartlang.org" 89 | source: hosted 90 | version: "0.12.0+2" 91 | http_parser: 92 | dependency: transitive 93 | description: 94 | name: http_parser 95 | url: "https://pub.dartlang.org" 96 | source: hosted 97 | version: "3.1.3" 98 | image: 99 | dependency: transitive 100 | description: 101 | name: image 102 | url: "https://pub.dartlang.org" 103 | source: hosted 104 | version: "2.1.4" 105 | matcher: 106 | dependency: transitive 107 | description: 108 | name: matcher 109 | url: "https://pub.dartlang.org" 110 | source: hosted 111 | version: "0.12.6" 112 | meta: 113 | dependency: transitive 114 | description: 115 | name: meta 116 | url: "https://pub.dartlang.org" 117 | source: hosted 118 | version: "1.1.8" 119 | path: 120 | dependency: transitive 121 | description: 122 | name: path 123 | url: "https://pub.dartlang.org" 124 | source: hosted 125 | version: "1.6.4" 126 | path_provider: 127 | dependency: "direct main" 128 | description: 129 | name: path_provider 130 | url: "https://pub.dartlang.org" 131 | source: hosted 132 | version: "1.5.1" 133 | pedantic: 134 | dependency: transitive 135 | description: 136 | name: pedantic 137 | url: "https://pub.dartlang.org" 138 | source: hosted 139 | version: "1.8.0+1" 140 | petitparser: 141 | dependency: transitive 142 | description: 143 | name: petitparser 144 | url: "https://pub.dartlang.org" 145 | source: hosted 146 | version: "2.4.0" 147 | platform: 148 | dependency: transitive 149 | description: 150 | name: platform 151 | url: "https://pub.dartlang.org" 152 | source: hosted 153 | version: "2.2.1" 154 | provider: 155 | dependency: "direct main" 156 | description: 157 | name: provider 158 | url: "https://pub.dartlang.org" 159 | source: hosted 160 | version: "3.2.0" 161 | quiver: 162 | dependency: transitive 163 | description: 164 | name: quiver 165 | url: "https://pub.dartlang.org" 166 | source: hosted 167 | version: "2.0.5" 168 | sky_engine: 169 | dependency: transitive 170 | description: flutter 171 | source: sdk 172 | version: "0.0.99" 173 | source_span: 174 | dependency: transitive 175 | description: 176 | name: source_span 177 | url: "https://pub.dartlang.org" 178 | source: hosted 179 | version: "1.5.5" 180 | stack_trace: 181 | dependency: transitive 182 | description: 183 | name: stack_trace 184 | url: "https://pub.dartlang.org" 185 | source: hosted 186 | version: "1.9.3" 187 | stream_channel: 188 | dependency: transitive 189 | description: 190 | name: stream_channel 191 | url: "https://pub.dartlang.org" 192 | source: hosted 193 | version: "2.0.0" 194 | string_scanner: 195 | dependency: transitive 196 | description: 197 | name: string_scanner 198 | url: "https://pub.dartlang.org" 199 | source: hosted 200 | version: "1.0.5" 201 | term_glyph: 202 | dependency: transitive 203 | description: 204 | name: term_glyph 205 | url: "https://pub.dartlang.org" 206 | source: hosted 207 | version: "1.1.0" 208 | test_api: 209 | dependency: transitive 210 | description: 211 | name: test_api 212 | url: "https://pub.dartlang.org" 213 | source: hosted 214 | version: "0.2.11" 215 | typed_data: 216 | dependency: transitive 217 | description: 218 | name: typed_data 219 | url: "https://pub.dartlang.org" 220 | source: hosted 221 | version: "1.1.6" 222 | vector_math: 223 | dependency: transitive 224 | description: 225 | name: vector_math 226 | url: "https://pub.dartlang.org" 227 | source: hosted 228 | version: "2.0.8" 229 | xml: 230 | dependency: transitive 231 | description: 232 | name: xml 233 | url: "https://pub.dartlang.org" 234 | source: hosted 235 | version: "3.5.0" 236 | sdks: 237 | dart: ">=2.4.0 <3.0.0" 238 | flutter: ">=1.10.0 <2.0.0" 239 | -------------------------------------------------------------------------------- /lib/screens/todo_app.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:my_todo/widgets/types_card.dart'; 3 | import 'package:provider/provider.dart'; 4 | import 'package:google_fonts/google_fonts.dart'; 5 | 6 | 7 | //screens 8 | import './loading_screen.dart'; 9 | 10 | //providers 11 | import '../providers/home.dart'; 12 | import '../providers/tasks.dart'; 13 | 14 | //widgets 15 | import '../widgets/new_type_dialog.dart'; 16 | import '../widgets/new_all_task_dialog.dart'; 17 | 18 | //values 19 | import '../values/values.dart' as values; 20 | 21 | 22 | int date = DateTime.now().day; 23 | int m = DateTime.now().month; 24 | String month = values.months[m]; 25 | int year = DateTime.now().year; 26 | 27 | class ToDo extends StatefulWidget { 28 | static const routeName = '/todo-screen'; 29 | @override 30 | _ToDoState createState() => _ToDoState(); 31 | } 32 | 33 | class _ToDoState extends State { 34 | bool _isLoading = false; 35 | bool _isListLoading = false; 36 | 37 | @override 38 | void initState(){ 39 | super.initState(); 40 | init(); 41 | } 42 | 43 | void init() async { 44 | setState(() { 45 | _isLoading = true; 46 | }); 47 | try { 48 | await Provider.of(context,listen:false).initializeAllData(); 49 | }catch(e){ 50 | //print(e); 51 | } 52 | setState(() { 53 | _isLoading = false; 54 | }); 55 | } 56 | 57 | Future removeTypeCard(String type) async { 58 | setState(() { 59 | _isListLoading = true; 60 | }); 61 | try { 62 | await Provider.of(context).deleteType(type); 63 | }catch(e){ 64 | //print(e); 65 | } 66 | setState(() { 67 | _isListLoading = false; 68 | }); 69 | } 70 | 71 | @override 72 | Widget build(BuildContext context) { 73 | final height = MediaQuery.of(context).size.height; 74 | final width = MediaQuery.of(context).size.width; 75 | final homeProvider = Provider.of(context); 76 | List taskProviders = homeProvider.getTaskProviders; 77 | return _isLoading ? LoadingScreen() : Scaffold( 78 | backgroundColor: Colors.blue, 79 | appBar: AppBar( 80 | elevation: 0, 81 | centerTitle: true, 82 | title: Text("My ToDo",style: GoogleFonts.poppins(textStyle: TextStyle(fontSize: 17,fontWeight: FontWeight.w600))), 83 | bottom: CustomAppBar(homeProvider.getUserName.split(" ")[0],homeProvider.getTypes.length), 84 | ), 85 | body: homeProvider.getTypes.length == 0 ? 86 | Center(child: Text("No ToDo",style: GoogleFonts.poppins(textStyle: TextStyle(color: Colors.white,fontSize: 20),))) 87 | : _isListLoading ? Center(child: CircularProgressIndicator(backgroundColor: Colors.white,),) : 88 | ListView.builder( 89 | physics: BouncingScrollPhysics(), 90 | padding: EdgeInsets.only(left: 20), 91 | scrollDirection: Axis.horizontal, 92 | itemCount: taskProviders.length, 93 | itemBuilder: (cyx,i){ 94 | return SingleChildScrollView( 95 | child: Column( 96 | children: [ 97 | ChangeNotifierProvider.value( 98 | value: taskProviders[i], 99 | child: Consumer( 100 | builder: (ctx,tasks,widget){ 101 | return TypesCard( 102 | height: height, 103 | width: width, 104 | type: tasks.getType, 105 | done: tasks.getTotalDone, 106 | total: tasks.getTotalTask, 107 | deleteFunction : removeTypeCard, 108 | tasksProvider: taskProviders[i], 109 | ); 110 | }, 111 | ), 112 | ) 113 | ], 114 | ), 115 | ); 116 | }, 117 | ) 118 | ); 119 | } 120 | } 121 | 122 | 123 | class CustomAppBar extends StatelessWidget with PreferredSizeWidget { 124 | final String _userName; 125 | final int _typeCount; 126 | CustomAppBar(this._userName,this._typeCount); 127 | final size = AppBar().preferredSize*3; 128 | @override 129 | Widget build(BuildContext context) { 130 | return Container( 131 | padding: EdgeInsets.only(left: 30,right: 20), 132 | height: size.height, 133 | width: AppBar().preferredSize.width, 134 | child: 135 | Column( 136 | mainAxisSize: MainAxisSize.min, 137 | mainAxisAlignment: MainAxisAlignment.start, 138 | crossAxisAlignment: CrossAxisAlignment.start, 139 | children: [ 140 | Text("Hello, $_userName",style: GoogleFonts.poppins(textStyle : TextStyle(color: Colors.white,fontSize: 30,fontWeight: FontWeight.w400),)), 141 | SizedBox(height: 15,), 142 | Text("Looks like feel good.",style: GoogleFonts.poppins( textStyle: TextStyle(color: Colors.white70 ,wordSpacing: 1,fontSize: 15)),), 143 | Text("Check what you want to finish today.",style: GoogleFonts.poppins( textStyle: TextStyle(color: Colors.white70 ,wordSpacing: 1,fontSize: 15)),), 144 | Row( 145 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 146 | crossAxisAlignment: CrossAxisAlignment.center, 147 | children: [ 148 | Text("Today : $month $date, $year".toUpperCase(),style: GoogleFonts.poppins(textStyle:TextStyle(color: Colors.white60,fontSize: 13)),textAlign: TextAlign.left,), 149 | Wrap( 150 | children: [ 151 | IconButton( 152 | icon: Icon(Icons.assignment,color: Colors.white,), 153 | tooltip: "Add Type", 154 | onPressed: (){ 155 | showDialog( 156 | context: context, 157 | builder: (context){ 158 | return NewTypeDialog(); 159 | } 160 | ); 161 | }, 162 | ), 163 | IconButton( 164 | icon: Icon(Icons.add_circle_outline,color: Colors.white,), 165 | tooltip: "Add Todo", 166 | onPressed: (){ 167 | if(_typeCount>=1){ 168 | showDialog( 169 | context: context, 170 | builder: (context){ 171 | return NewAllTaskDialog(); 172 | } 173 | ); 174 | }else{ 175 | showDialog( 176 | context: context, 177 | builder: (ctx){ 178 | return AlertDialog( 179 | title: Text("First add a type",style:GoogleFonts.poppins(textStyle: TextStyle(fontWeight: FontWeight.w500,fontSize: 20))), 180 | actions: [ 181 | FlatButton( 182 | child: Text("Close",style: GoogleFonts.poppins(textStyle: TextStyle(fontWeight: FontWeight.w500))), 183 | onPressed: (){ 184 | Navigator.of(context).pop(); 185 | }, 186 | ) 187 | ], 188 | ); 189 | } 190 | ); 191 | } 192 | }, 193 | ), 194 | ], 195 | ) 196 | ], 197 | ) 198 | ], 199 | ), 200 | ); 201 | } 202 | 203 | @override 204 | Size get preferredSize => size; 205 | } -------------------------------------------------------------------------------- /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 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; 13 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 14 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 15 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; 16 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 17 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 18 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 19 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXCopyFilesBuildPhase section */ 23 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 24 | isa = PBXCopyFilesBuildPhase; 25 | buildActionMask = 2147483647; 26 | dstPath = ""; 27 | dstSubfolderSpec = 10; 28 | files = ( 29 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, 30 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, 31 | ); 32 | name = "Embed Frameworks"; 33 | runOnlyForDeploymentPostprocessing = 0; 34 | }; 35 | /* End PBXCopyFilesBuildPhase section */ 36 | 37 | /* Begin PBXFileReference section */ 38 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 39 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 40 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 41 | 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 42 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 43 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 44 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 45 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 46 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 47 | 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; 48 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 50 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 51 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 52 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 53 | /* End PBXFileReference section */ 54 | 55 | /* Begin PBXFrameworksBuildPhase section */ 56 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 57 | isa = PBXFrameworksBuildPhase; 58 | buildActionMask = 2147483647; 59 | files = ( 60 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, 61 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, 62 | ); 63 | runOnlyForDeploymentPostprocessing = 0; 64 | }; 65 | /* End PBXFrameworksBuildPhase section */ 66 | 67 | /* Begin PBXGroup section */ 68 | 9740EEB11CF90186004384FC /* Flutter */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | 3B80C3931E831B6300D905FE /* App.framework */, 72 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 73 | 9740EEBA1CF902C7004384FC /* Flutter.framework */, 74 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 75 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 76 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 77 | ); 78 | name = Flutter; 79 | sourceTree = ""; 80 | }; 81 | 97C146E51CF9000F007C117D = { 82 | isa = PBXGroup; 83 | children = ( 84 | 9740EEB11CF90186004384FC /* Flutter */, 85 | 97C146F01CF9000F007C117D /* Runner */, 86 | 97C146EF1CF9000F007C117D /* Products */, 87 | ); 88 | sourceTree = ""; 89 | }; 90 | 97C146EF1CF9000F007C117D /* Products */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 97C146EE1CF9000F007C117D /* Runner.app */, 94 | ); 95 | name = Products; 96 | sourceTree = ""; 97 | }; 98 | 97C146F01CF9000F007C117D /* Runner */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 102 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 103 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 104 | 97C147021CF9000F007C117D /* Info.plist */, 105 | 97C146F11CF9000F007C117D /* Supporting Files */, 106 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 107 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 108 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 109 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 110 | ); 111 | path = Runner; 112 | sourceTree = ""; 113 | }; 114 | 97C146F11CF9000F007C117D /* Supporting Files */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | ); 118 | name = "Supporting Files"; 119 | sourceTree = ""; 120 | }; 121 | /* End PBXGroup section */ 122 | 123 | /* Begin PBXNativeTarget section */ 124 | 97C146ED1CF9000F007C117D /* Runner */ = { 125 | isa = PBXNativeTarget; 126 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 127 | buildPhases = ( 128 | 9740EEB61CF901F6004384FC /* Run Script */, 129 | 97C146EA1CF9000F007C117D /* Sources */, 130 | 97C146EB1CF9000F007C117D /* Frameworks */, 131 | 97C146EC1CF9000F007C117D /* Resources */, 132 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 133 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 134 | ); 135 | buildRules = ( 136 | ); 137 | dependencies = ( 138 | ); 139 | name = Runner; 140 | productName = Runner; 141 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 142 | productType = "com.apple.product-type.application"; 143 | }; 144 | /* End PBXNativeTarget section */ 145 | 146 | /* Begin PBXProject section */ 147 | 97C146E61CF9000F007C117D /* Project object */ = { 148 | isa = PBXProject; 149 | attributes = { 150 | LastUpgradeCheck = 1020; 151 | ORGANIZATIONNAME = "The Chromium Authors"; 152 | TargetAttributes = { 153 | 97C146ED1CF9000F007C117D = { 154 | CreatedOnToolsVersion = 7.3.1; 155 | LastSwiftMigration = 1100; 156 | }; 157 | }; 158 | }; 159 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 160 | compatibilityVersion = "Xcode 3.2"; 161 | developmentRegion = en; 162 | hasScannedForEncodings = 0; 163 | knownRegions = ( 164 | en, 165 | Base, 166 | ); 167 | mainGroup = 97C146E51CF9000F007C117D; 168 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 169 | projectDirPath = ""; 170 | projectRoot = ""; 171 | targets = ( 172 | 97C146ED1CF9000F007C117D /* Runner */, 173 | ); 174 | }; 175 | /* End PBXProject section */ 176 | 177 | /* Begin PBXResourcesBuildPhase section */ 178 | 97C146EC1CF9000F007C117D /* Resources */ = { 179 | isa = PBXResourcesBuildPhase; 180 | buildActionMask = 2147483647; 181 | files = ( 182 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 183 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 184 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 185 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 186 | ); 187 | runOnlyForDeploymentPostprocessing = 0; 188 | }; 189 | /* End PBXResourcesBuildPhase section */ 190 | 191 | /* Begin PBXShellScriptBuildPhase section */ 192 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 193 | isa = PBXShellScriptBuildPhase; 194 | buildActionMask = 2147483647; 195 | files = ( 196 | ); 197 | inputPaths = ( 198 | ); 199 | name = "Thin Binary"; 200 | outputPaths = ( 201 | ); 202 | runOnlyForDeploymentPostprocessing = 0; 203 | shellPath = /bin/sh; 204 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; 205 | }; 206 | 9740EEB61CF901F6004384FC /* Run Script */ = { 207 | isa = PBXShellScriptBuildPhase; 208 | buildActionMask = 2147483647; 209 | files = ( 210 | ); 211 | inputPaths = ( 212 | ); 213 | name = "Run Script"; 214 | outputPaths = ( 215 | ); 216 | runOnlyForDeploymentPostprocessing = 0; 217 | shellPath = /bin/sh; 218 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 219 | }; 220 | /* End PBXShellScriptBuildPhase section */ 221 | 222 | /* Begin PBXSourcesBuildPhase section */ 223 | 97C146EA1CF9000F007C117D /* Sources */ = { 224 | isa = PBXSourcesBuildPhase; 225 | buildActionMask = 2147483647; 226 | files = ( 227 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 228 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 229 | ); 230 | runOnlyForDeploymentPostprocessing = 0; 231 | }; 232 | /* End PBXSourcesBuildPhase section */ 233 | 234 | /* Begin PBXVariantGroup section */ 235 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 236 | isa = PBXVariantGroup; 237 | children = ( 238 | 97C146FB1CF9000F007C117D /* Base */, 239 | ); 240 | name = Main.storyboard; 241 | sourceTree = ""; 242 | }; 243 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 244 | isa = PBXVariantGroup; 245 | children = ( 246 | 97C147001CF9000F007C117D /* Base */, 247 | ); 248 | name = LaunchScreen.storyboard; 249 | sourceTree = ""; 250 | }; 251 | /* End PBXVariantGroup section */ 252 | 253 | /* Begin XCBuildConfiguration section */ 254 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 255 | isa = XCBuildConfiguration; 256 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 257 | buildSettings = { 258 | ALWAYS_SEARCH_USER_PATHS = NO; 259 | CLANG_ANALYZER_NONNULL = YES; 260 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 261 | CLANG_CXX_LIBRARY = "libc++"; 262 | CLANG_ENABLE_MODULES = YES; 263 | CLANG_ENABLE_OBJC_ARC = YES; 264 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 265 | CLANG_WARN_BOOL_CONVERSION = YES; 266 | CLANG_WARN_COMMA = YES; 267 | CLANG_WARN_CONSTANT_CONVERSION = YES; 268 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 269 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 270 | CLANG_WARN_EMPTY_BODY = YES; 271 | CLANG_WARN_ENUM_CONVERSION = YES; 272 | CLANG_WARN_INFINITE_RECURSION = YES; 273 | CLANG_WARN_INT_CONVERSION = YES; 274 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 275 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 276 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 277 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 278 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 279 | CLANG_WARN_STRICT_PROTOTYPES = YES; 280 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 281 | CLANG_WARN_UNREACHABLE_CODE = YES; 282 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 283 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 284 | COPY_PHASE_STRIP = NO; 285 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 286 | ENABLE_NS_ASSERTIONS = NO; 287 | ENABLE_STRICT_OBJC_MSGSEND = YES; 288 | GCC_C_LANGUAGE_STANDARD = gnu99; 289 | GCC_NO_COMMON_BLOCKS = YES; 290 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 291 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 292 | GCC_WARN_UNDECLARED_SELECTOR = YES; 293 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 294 | GCC_WARN_UNUSED_FUNCTION = YES; 295 | GCC_WARN_UNUSED_VARIABLE = YES; 296 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 297 | MTL_ENABLE_DEBUG_INFO = NO; 298 | SDKROOT = iphoneos; 299 | SUPPORTED_PLATFORMS = iphoneos; 300 | TARGETED_DEVICE_FAMILY = "1,2"; 301 | VALIDATE_PRODUCT = YES; 302 | }; 303 | name = Profile; 304 | }; 305 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 306 | isa = XCBuildConfiguration; 307 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 308 | buildSettings = { 309 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 310 | CLANG_ENABLE_MODULES = YES; 311 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 312 | ENABLE_BITCODE = NO; 313 | FRAMEWORK_SEARCH_PATHS = ( 314 | "$(inherited)", 315 | "$(PROJECT_DIR)/Flutter", 316 | ); 317 | INFOPLIST_FILE = Runner/Info.plist; 318 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 319 | LIBRARY_SEARCH_PATHS = ( 320 | "$(inherited)", 321 | "$(PROJECT_DIR)/Flutter", 322 | ); 323 | PRODUCT_BUNDLE_IDENTIFIER = com.example.myTodo; 324 | PRODUCT_NAME = "$(TARGET_NAME)"; 325 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 326 | SWIFT_VERSION = 5.0; 327 | VERSIONING_SYSTEM = "apple-generic"; 328 | }; 329 | name = Profile; 330 | }; 331 | 97C147031CF9000F007C117D /* Debug */ = { 332 | isa = XCBuildConfiguration; 333 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 334 | buildSettings = { 335 | ALWAYS_SEARCH_USER_PATHS = NO; 336 | CLANG_ANALYZER_NONNULL = YES; 337 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 338 | CLANG_CXX_LIBRARY = "libc++"; 339 | CLANG_ENABLE_MODULES = YES; 340 | CLANG_ENABLE_OBJC_ARC = YES; 341 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 342 | CLANG_WARN_BOOL_CONVERSION = YES; 343 | CLANG_WARN_COMMA = YES; 344 | CLANG_WARN_CONSTANT_CONVERSION = YES; 345 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 346 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 347 | CLANG_WARN_EMPTY_BODY = YES; 348 | CLANG_WARN_ENUM_CONVERSION = YES; 349 | CLANG_WARN_INFINITE_RECURSION = YES; 350 | CLANG_WARN_INT_CONVERSION = YES; 351 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 352 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 353 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 354 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 355 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 356 | CLANG_WARN_STRICT_PROTOTYPES = YES; 357 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 358 | CLANG_WARN_UNREACHABLE_CODE = YES; 359 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 360 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 361 | COPY_PHASE_STRIP = NO; 362 | DEBUG_INFORMATION_FORMAT = dwarf; 363 | ENABLE_STRICT_OBJC_MSGSEND = YES; 364 | ENABLE_TESTABILITY = YES; 365 | GCC_C_LANGUAGE_STANDARD = gnu99; 366 | GCC_DYNAMIC_NO_PIC = NO; 367 | GCC_NO_COMMON_BLOCKS = YES; 368 | GCC_OPTIMIZATION_LEVEL = 0; 369 | GCC_PREPROCESSOR_DEFINITIONS = ( 370 | "DEBUG=1", 371 | "$(inherited)", 372 | ); 373 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 374 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 375 | GCC_WARN_UNDECLARED_SELECTOR = YES; 376 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 377 | GCC_WARN_UNUSED_FUNCTION = YES; 378 | GCC_WARN_UNUSED_VARIABLE = YES; 379 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 380 | MTL_ENABLE_DEBUG_INFO = YES; 381 | ONLY_ACTIVE_ARCH = YES; 382 | SDKROOT = iphoneos; 383 | TARGETED_DEVICE_FAMILY = "1,2"; 384 | }; 385 | name = Debug; 386 | }; 387 | 97C147041CF9000F007C117D /* Release */ = { 388 | isa = XCBuildConfiguration; 389 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 390 | buildSettings = { 391 | ALWAYS_SEARCH_USER_PATHS = NO; 392 | CLANG_ANALYZER_NONNULL = YES; 393 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 394 | CLANG_CXX_LIBRARY = "libc++"; 395 | CLANG_ENABLE_MODULES = YES; 396 | CLANG_ENABLE_OBJC_ARC = YES; 397 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 398 | CLANG_WARN_BOOL_CONVERSION = YES; 399 | CLANG_WARN_COMMA = YES; 400 | CLANG_WARN_CONSTANT_CONVERSION = YES; 401 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 402 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 403 | CLANG_WARN_EMPTY_BODY = YES; 404 | CLANG_WARN_ENUM_CONVERSION = YES; 405 | CLANG_WARN_INFINITE_RECURSION = YES; 406 | CLANG_WARN_INT_CONVERSION = YES; 407 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 408 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 409 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 410 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 411 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 412 | CLANG_WARN_STRICT_PROTOTYPES = YES; 413 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 414 | CLANG_WARN_UNREACHABLE_CODE = YES; 415 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 416 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 417 | COPY_PHASE_STRIP = NO; 418 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 419 | ENABLE_NS_ASSERTIONS = NO; 420 | ENABLE_STRICT_OBJC_MSGSEND = YES; 421 | GCC_C_LANGUAGE_STANDARD = gnu99; 422 | GCC_NO_COMMON_BLOCKS = YES; 423 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 424 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 425 | GCC_WARN_UNDECLARED_SELECTOR = YES; 426 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 427 | GCC_WARN_UNUSED_FUNCTION = YES; 428 | GCC_WARN_UNUSED_VARIABLE = YES; 429 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 430 | MTL_ENABLE_DEBUG_INFO = NO; 431 | SDKROOT = iphoneos; 432 | SUPPORTED_PLATFORMS = iphoneos; 433 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 434 | TARGETED_DEVICE_FAMILY = "1,2"; 435 | VALIDATE_PRODUCT = YES; 436 | }; 437 | name = Release; 438 | }; 439 | 97C147061CF9000F007C117D /* Debug */ = { 440 | isa = XCBuildConfiguration; 441 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 442 | buildSettings = { 443 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 444 | CLANG_ENABLE_MODULES = YES; 445 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 446 | ENABLE_BITCODE = NO; 447 | FRAMEWORK_SEARCH_PATHS = ( 448 | "$(inherited)", 449 | "$(PROJECT_DIR)/Flutter", 450 | ); 451 | INFOPLIST_FILE = Runner/Info.plist; 452 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 453 | LIBRARY_SEARCH_PATHS = ( 454 | "$(inherited)", 455 | "$(PROJECT_DIR)/Flutter", 456 | ); 457 | PRODUCT_BUNDLE_IDENTIFIER = com.example.myTodo; 458 | PRODUCT_NAME = "$(TARGET_NAME)"; 459 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 460 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 461 | SWIFT_VERSION = 5.0; 462 | VERSIONING_SYSTEM = "apple-generic"; 463 | }; 464 | name = Debug; 465 | }; 466 | 97C147071CF9000F007C117D /* Release */ = { 467 | isa = XCBuildConfiguration; 468 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 469 | buildSettings = { 470 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 471 | CLANG_ENABLE_MODULES = YES; 472 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 473 | ENABLE_BITCODE = NO; 474 | FRAMEWORK_SEARCH_PATHS = ( 475 | "$(inherited)", 476 | "$(PROJECT_DIR)/Flutter", 477 | ); 478 | INFOPLIST_FILE = Runner/Info.plist; 479 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 480 | LIBRARY_SEARCH_PATHS = ( 481 | "$(inherited)", 482 | "$(PROJECT_DIR)/Flutter", 483 | ); 484 | PRODUCT_BUNDLE_IDENTIFIER = com.example.myTodo; 485 | PRODUCT_NAME = "$(TARGET_NAME)"; 486 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 487 | SWIFT_VERSION = 5.0; 488 | VERSIONING_SYSTEM = "apple-generic"; 489 | }; 490 | name = Release; 491 | }; 492 | /* End XCBuildConfiguration section */ 493 | 494 | /* Begin XCConfigurationList section */ 495 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 496 | isa = XCConfigurationList; 497 | buildConfigurations = ( 498 | 97C147031CF9000F007C117D /* Debug */, 499 | 97C147041CF9000F007C117D /* Release */, 500 | 249021D3217E4FDB00AE95B9 /* Profile */, 501 | ); 502 | defaultConfigurationIsVisible = 0; 503 | defaultConfigurationName = Release; 504 | }; 505 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 506 | isa = XCConfigurationList; 507 | buildConfigurations = ( 508 | 97C147061CF9000F007C117D /* Debug */, 509 | 97C147071CF9000F007C117D /* Release */, 510 | 249021D4217E4FDB00AE95B9 /* Profile */, 511 | ); 512 | defaultConfigurationIsVisible = 0; 513 | defaultConfigurationName = Release; 514 | }; 515 | /* End XCConfigurationList section */ 516 | }; 517 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 518 | } 519 | --------------------------------------------------------------------------------