├── ios
├── Runner
│ ├── Runner-Bridging-Header.h
│ ├── Assets.xcassets
│ │ ├── LaunchImage.imageset
│ │ │ ├── LaunchImage.png
│ │ │ ├── LaunchImage@2x.png
│ │ │ ├── LaunchImage@3x.png
│ │ │ ├── README.md
│ │ │ └── Contents.json
│ │ ├── AppIcon.appiconset
│ │ │ ├── Icon-App-20x20@1x.png
│ │ │ ├── Icon-App-20x20@2x.png
│ │ │ ├── Icon-App-20x20@3x.png
│ │ │ ├── Icon-App-29x29@1x.png
│ │ │ ├── Icon-App-29x29@2x.png
│ │ │ ├── Icon-App-29x29@3x.png
│ │ │ ├── Icon-App-40x40@1x.png
│ │ │ ├── Icon-App-40x40@2x.png
│ │ │ ├── Icon-App-40x40@3x.png
│ │ │ ├── Icon-App-60x60@2x.png
│ │ │ ├── Icon-App-60x60@3x.png
│ │ │ ├── Icon-App-76x76@1x.png
│ │ │ ├── Icon-App-76x76@2x.png
│ │ │ ├── Icon-App-1024x1024@1x.png
│ │ │ ├── Icon-App-83.5x83.5@2x.png
│ │ │ └── Contents.json
│ │ ├── LaunchBackground.imageset
│ │ │ ├── background.png
│ │ │ └── Contents.json
│ │ └── BrandingImage.imageset
│ │ │ └── Contents.json
│ ├── Runner.entitlements
│ ├── AppDelegate.swift
│ ├── Base.lproj
│ │ ├── Main.storyboard
│ │ └── LaunchScreen.storyboard
│ └── Info.plist
├── Flutter
│ ├── Debug.xcconfig
│ ├── Release.xcconfig
│ └── AppFrameworkInfo.plist
├── Runner.xcodeproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── WorkspaceSettings.xcsettings
│ │ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── WorkspaceSettings.xcsettings
│ │ └── IDEWorkspaceChecks.plist
├── .gitignore
└── Podfile
├── web
├── favicon.png
├── icons
│ ├── Icon-192.png
│ ├── Icon-512.png
│ ├── Icon-maskable-192.png
│ └── Icon-maskable-512.png
├── splash
│ ├── img
│ │ ├── dark-1x.png
│ │ ├── dark-2x.png
│ │ ├── dark-3x.png
│ │ ├── dark-4x.png
│ │ ├── light-1x.png
│ │ ├── light-2x.png
│ │ ├── light-3x.png
│ │ └── light-4x.png
│ ├── splash.js
│ └── style.css
├── manifest.json
└── index.html
├── lib
├── img
│ ├── logo_350.png
│ ├── star_img.png
│ ├── todoImage.jpg
│ ├── placeholder.jpg
│ ├── businessman-min.png
│ ├── cnameicon.svg
│ └── editicon.svg
├── screenshots
│ ├── addtodo.png
│ ├── profile.png
│ ├── dashboard.png
│ ├── homepage1.png
│ ├── homepage2.png
│ ├── description.png
│ └── splashscreen.png
├── Widgets
│ ├── Profile
│ │ ├── string_extension.dart
│ │ ├── todos_big_container.dart
│ │ ├── todos_stats_comp.dart
│ │ ├── name_text.dart
│ │ ├── profile_circle.dart
│ │ └── todos_container.dart
│ ├── DetailPage
│ │ ├── todo_description.dart
│ │ └── todo_info_section.dart
│ ├── Dashboard
│ │ ├── complete_todo_list.dart
│ │ ├── completed_task_info.dart
│ │ ├── clear_todos_btn.dart
│ │ └── complete_todo_card.dart
│ ├── ChangeName
│ │ └── change_name_text.dart
│ ├── Welcome
│ │ ├── welcome_tf.dart
│ │ └── welcome_text.dart
│ ├── Todo
│ │ ├── todo_list.dart
│ │ ├── edit_tf.dart
│ │ ├── custom_tf.dart
│ │ └── todo_card.dart
│ └── HomePage
│ │ ├── Grettings
│ │ └── greetings.dart
│ │ ├── Info
│ │ └── info_widget.dart
│ │ └── Tasks
│ │ └── task_info.dart
├── provider
│ ├── shared_prefences_helper.dart
│ └── todos_provider.dart
├── generated_plugin_registrant.dart
├── Models
│ └── todo.dart
├── Pages
│ ├── dashboard_page.dart
│ ├── profile_page.dart
│ ├── home_page.dart
│ ├── calendar_page.dart
│ ├── welcome_screen.dart
│ ├── detail_screen.dart
│ ├── change_name_page.dart
│ ├── main_screen.dart
│ └── edit_todo.dart
├── main.dart
├── langs
│ ├── en.json
│ └── tr.json
├── Review
│ └── review_service.dart
└── translations
│ ├── locale_keys.g.dart
│ └── codegen_loader.g.dart
├── app_icons
├── iosicon.png
├── androidicon.png
└── appiconios.png
├── android
├── gradle.properties
├── app
│ ├── src
│ │ ├── main
│ │ │ ├── res
│ │ │ │ ├── drawable-hdpi
│ │ │ │ │ └── splash.png
│ │ │ │ ├── drawable-mdpi
│ │ │ │ │ └── splash.png
│ │ │ │ ├── drawable-xhdpi
│ │ │ │ │ └── splash.png
│ │ │ │ ├── drawable
│ │ │ │ │ ├── background.png
│ │ │ │ │ └── launch_background.xml
│ │ │ │ ├── drawable-v21
│ │ │ │ │ ├── background.png
│ │ │ │ │ └── launch_background.xml
│ │ │ │ ├── drawable-xxhdpi
│ │ │ │ │ └── splash.png
│ │ │ │ ├── drawable-xxxhdpi
│ │ │ │ │ └── splash.png
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxxhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── values-v31
│ │ │ │ │ └── styles.xml
│ │ │ │ ├── values-night
│ │ │ │ │ └── styles.xml
│ │ │ │ └── values
│ │ │ │ │ └── styles.xml
│ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ └── yagizdokumaci
│ │ │ │ │ └── todo_app
│ │ │ │ │ └── MainActivity.kt
│ │ │ └── AndroidManifest.xml
│ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ └── profile
│ │ │ └── AndroidManifest.xml
│ └── build.gradle
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
├── .gitignore
├── settings.gradle
└── build.gradle
├── .metadata
├── test
└── widget_test.dart
├── analysis_options.yaml
├── README.md
└── pubspec.yaml
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/web/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/web/favicon.png
--------------------------------------------------------------------------------
/lib/img/logo_350.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/lib/img/logo_350.png
--------------------------------------------------------------------------------
/lib/img/star_img.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/lib/img/star_img.png
--------------------------------------------------------------------------------
/app_icons/iosicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/app_icons/iosicon.png
--------------------------------------------------------------------------------
/lib/img/todoImage.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/lib/img/todoImage.jpg
--------------------------------------------------------------------------------
/web/icons/Icon-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/web/icons/Icon-192.png
--------------------------------------------------------------------------------
/web/icons/Icon-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/web/icons/Icon-512.png
--------------------------------------------------------------------------------
/app_icons/androidicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/app_icons/androidicon.png
--------------------------------------------------------------------------------
/app_icons/appiconios.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/app_icons/appiconios.png
--------------------------------------------------------------------------------
/lib/img/placeholder.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/lib/img/placeholder.jpg
--------------------------------------------------------------------------------
/lib/img/businessman-min.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/lib/img/businessman-min.png
--------------------------------------------------------------------------------
/lib/screenshots/addtodo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/lib/screenshots/addtodo.png
--------------------------------------------------------------------------------
/lib/screenshots/profile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/lib/screenshots/profile.png
--------------------------------------------------------------------------------
/web/splash/img/dark-1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/web/splash/img/dark-1x.png
--------------------------------------------------------------------------------
/web/splash/img/dark-2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/web/splash/img/dark-2x.png
--------------------------------------------------------------------------------
/web/splash/img/dark-3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/web/splash/img/dark-3x.png
--------------------------------------------------------------------------------
/web/splash/img/dark-4x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/web/splash/img/dark-4x.png
--------------------------------------------------------------------------------
/web/splash/img/light-1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/web/splash/img/light-1x.png
--------------------------------------------------------------------------------
/web/splash/img/light-2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/web/splash/img/light-2x.png
--------------------------------------------------------------------------------
/web/splash/img/light-3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/web/splash/img/light-3x.png
--------------------------------------------------------------------------------
/web/splash/img/light-4x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/web/splash/img/light-4x.png
--------------------------------------------------------------------------------
/lib/screenshots/dashboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/lib/screenshots/dashboard.png
--------------------------------------------------------------------------------
/lib/screenshots/homepage1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/lib/screenshots/homepage1.png
--------------------------------------------------------------------------------
/lib/screenshots/homepage2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/lib/screenshots/homepage2.png
--------------------------------------------------------------------------------
/lib/screenshots/description.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/lib/screenshots/description.png
--------------------------------------------------------------------------------
/lib/screenshots/splashscreen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/lib/screenshots/splashscreen.png
--------------------------------------------------------------------------------
/web/icons/Icon-maskable-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/web/icons/Icon-maskable-192.png
--------------------------------------------------------------------------------
/web/icons/Icon-maskable-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/web/icons/Icon-maskable-512.png
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 |
--------------------------------------------------------------------------------
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-hdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/android/app/src/main/res/drawable-hdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-mdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/android/app/src/main/res/drawable-mdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/android/app/src/main/res/drawable-xhdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/android/app/src/main/res/drawable/background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-v21/background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/android/app/src/main/res/drawable-v21/background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xxhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/android/app/src/main/res/drawable-xxhdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xxxhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/android/app/src/main/res/drawable-xxxhdpi/splash.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/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/yagizdo/Todo-Moon/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/yagizdo/Todo-Moon/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/yagizdo/Todo-Moon/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/yagizdo/Todo-Moon/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/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/yagizdo/Todo-Moon/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/yagizdo/Todo-Moon/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/yagizdo/Todo-Moon/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/yagizdo/Todo-Moon/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/yagizdo/Todo-Moon/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/yagizdo/Todo-Moon/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/yagizdo/Todo-Moon/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/yagizdo/Todo-Moon/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/yagizdo/Todo-Moon/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/yagizdo/Todo-Moon/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/yagizdo/Todo-Moon/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/yagizdo/Todo-Moon/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yagizdo/Todo-Moon/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/yagizdo/Todo-Moon/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/web/splash/splash.js:
--------------------------------------------------------------------------------
1 | function removeSplashFromWeb() {
2 | const elem = document.getElementById("splash");
3 | if (elem) {
4 | elem.remove();
5 | }
6 | document.body.style.background = "transparent";
7 | }
8 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/yagizdokumaci/todo_app/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.yagizdokumaci.todo_app
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Jun 23 08:50:38 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
7 |
--------------------------------------------------------------------------------
/ios/Runner/Runner.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | aps-environment
6 | development
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/lib/img/cnameicon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/lib/Widgets/Profile/string_extension.dart:
--------------------------------------------------------------------------------
1 | extension StringCasingExtension on String {
2 | String toCapitalized() =>
3 | length > 0 ? '${this[0].toUpperCase()}${substring(1).toLowerCase()}' : '';
4 | String toTitleCase() => replaceAll(RegExp(' +'), ' ')
5 | .split(' ')
6 | .map((str) => str.toCapitalized())
7 | .join(' ');
8 | }
9 |
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: 18116933e77adc82f80866c928266a5b4f1ed645
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
9 | # Remember to never publicly share your keystore.
10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
11 | key.properties
12 | **/*.keystore
13 | **/*.jks
14 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
4 |
5 |
6 | -
7 |
8 |
9 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-v21/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
4 |
5 |
6 | -
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/lib/provider/shared_prefences_helper.dart:
--------------------------------------------------------------------------------
1 | import 'package:shared_preferences/shared_preferences.dart';
2 |
3 | class SharedPreferencesHelper {
4 | static SharedPreferences? _instance;
5 | static SharedPreferences get instance => _instance!;
6 |
7 | static Future init() async {
8 | _instance ??= await SharedPreferences.getInstance();
9 | return _instance!;
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "background.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "author" : "xcode",
19 | "version" : 1
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
4 | def properties = new Properties()
5 |
6 | assert localPropertiesFile.exists()
7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
8 |
9 | def flutterSdkPath = properties.getProperty("flutter.sdk")
10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
12 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "LaunchImage.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "LaunchImage@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "LaunchImage@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/BrandingImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "BrandingImage.png",
5 | "idiom" : "universal",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "BrandingImage@2x.png",
10 | "idiom" : "universal",
11 | "scale" : "2x"
12 | },
13 | {
14 | "filename" : "BrandingImage@3x.png",
15 | "idiom" : "universal",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "author" : "xcode",
21 | "version" : 1
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/lib/img/editicon.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.6.10'
3 | repositories {
4 | google()
5 | mavenCentral()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:4.1.0'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | mavenCentral()
18 | }
19 | }
20 |
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 | project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | project.evaluationDependsOn(':app')
25 | }
26 |
27 | task clean(type: Delete) {
28 | delete rootProject.buildDir
29 | }
30 |
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | **/dgph
2 | *.mode1v3
3 | *.mode2v3
4 | *.moved-aside
5 | *.pbxuser
6 | *.perspectivev3
7 | **/*sync/
8 | .sconsign.dblite
9 | .tags*
10 | **/.vagrant/
11 | **/DerivedData/
12 | Icon?
13 | **/Pods/
14 | **/.symlinks/
15 | profile
16 | xcuserdata
17 | **/.generated/
18 | Flutter/App.framework
19 | Flutter/Flutter.framework
20 | Flutter/Flutter.podspec
21 | Flutter/Generated.xcconfig
22 | Flutter/ephemeral/
23 | Flutter/app.flx
24 | Flutter/app.zip
25 | Flutter/flutter_assets/
26 | Flutter/flutter_export_environment.sh
27 | ServiceDefinitions.json
28 | Runner/GeneratedPluginRegistrant.*
29 |
30 | # Exceptions to above rules.
31 | !default.mode1v3
32 | !default.mode2v3
33 | !default.pbxuser
34 | !default.perspectivev3
35 |
--------------------------------------------------------------------------------
/web/splash/style.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin:0;
3 | height:100%;
4 | background: #ffffff;
5 |
6 | background-size: 100% 100%;
7 | }
8 |
9 | .center {
10 | margin: 0;
11 | position: absolute;
12 | top: 50%;
13 | left: 50%;
14 | -ms-transform: translate(-50%, -50%);
15 | transform: translate(-50%, -50%);
16 | }
17 |
18 | .contain {
19 | display:block;
20 | width:100%; height:100%;
21 | object-fit: contain;
22 | }
23 |
24 | .stretch {
25 | display:block;
26 | width:100%; height:100%;
27 | }
28 |
29 | .cover {
30 | display:block;
31 | width:100%; height:100%;
32 | object-fit: cover;
33 | }
34 |
35 | @media (prefers-color-scheme: dark) {
36 | body {
37 | margin:0;
38 | height:100%;
39 | background: #ffffff;
40 |
41 | background-size: 100% 100%;
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 9.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/lib/Widgets/DetailPage/todo_description.dart:
--------------------------------------------------------------------------------
1 | import 'package:auto_size_text/auto_size_text.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:flutter_screenutil/flutter_screenutil.dart';
4 | import 'package:todo_app/Models/todo.dart';
5 |
6 | class TodoDescription extends StatelessWidget {
7 | TodoDescription({Key? key, required this.todo, required this.textFontSize})
8 | : super(key: key);
9 | Todo todo;
10 | double textFontSize;
11 |
12 | @override
13 | Widget build(BuildContext context) {
14 | return Padding(
15 | padding: EdgeInsets.only(left: 20.w, right: 20.w, top: 20.h),
16 | child: Container(
17 | alignment: Alignment.topCenter,
18 | child: AutoSizeText(
19 | todo.description,
20 | textAlign: TextAlign.start,
21 | style: TextStyle(fontSize: textFontSize),
22 | ),
23 | ),
24 | );
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/lib/generated_plugin_registrant.dart:
--------------------------------------------------------------------------------
1 | //
2 | // Generated file. Do not edit.
3 | //
4 |
5 | // ignore_for_file: directives_ordering
6 | // ignore_for_file: lines_longer_than_80_chars
7 | // ignore_for_file: depend_on_referenced_packages
8 |
9 | import 'package:flutter_native_splash/flutter_native_splash_web.dart';
10 | import 'package:fluttertoast/fluttertoast_web.dart';
11 | import 'package:image_picker_for_web/image_picker_for_web.dart';
12 | import 'package:shared_preferences_web/shared_preferences_web.dart';
13 | import 'package:url_launcher_web/url_launcher_web.dart';
14 |
15 | import 'package:flutter_web_plugins/flutter_web_plugins.dart';
16 |
17 | // ignore: public_member_api_docs
18 | void registerPlugins(Registrar registrar) {
19 | FlutterNativeSplashWeb.registerWith(registrar);
20 | FluttertoastWebPlugin.registerWith(registrar);
21 | ImagePickerPlugin.registerWith(registrar);
22 | SharedPreferencesPlugin.registerWith(registrar);
23 | UrlLauncherPlugin.registerWith(registrar);
24 | registrar.registerMessageHandler();
25 | }
26 |
--------------------------------------------------------------------------------
/web/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "todo_app",
3 | "short_name": "todo_app",
4 | "start_url": ".",
5 | "display": "standalone",
6 | "background_color": "#0175C2",
7 | "theme_color": "#0175C2",
8 | "description": "A new Flutter project.",
9 | "orientation": "portrait-primary",
10 | "prefer_related_applications": false,
11 | "icons": [
12 | {
13 | "src": "icons/Icon-192.png",
14 | "sizes": "192x192",
15 | "type": "image/png"
16 | },
17 | {
18 | "src": "icons/Icon-512.png",
19 | "sizes": "512x512",
20 | "type": "image/png"
21 | },
22 | {
23 | "src": "icons/Icon-maskable-192.png",
24 | "sizes": "192x192",
25 | "type": "image/png",
26 | "purpose": "maskable"
27 | },
28 | {
29 | "src": "icons/Icon-maskable-512.png",
30 | "sizes": "512x512",
31 | "type": "image/png",
32 | "purpose": "maskable"
33 | }
34 | ]
35 | }
36 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values-v31/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values-night/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/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 | void main() {
12 | testWidgets('Counter increments smoke test', (WidgetTester tester) async {
13 | // Build our app and trigger a frame.
14 | //await tester.pumpWidget(MyApp());
15 |
16 | // Verify that our counter starts at 0.
17 | expect(find.text('0'), findsOneWidget);
18 | expect(find.text('1'), findsNothing);
19 |
20 | // Tap the '+' icon and trigger a frame.
21 | await tester.tap(find.byIcon(Icons.add));
22 | await tester.pump();
23 |
24 | // Verify that our counter has incremented.
25 | expect(find.text('0'), findsNothing);
26 | expect(find.text('1'), findsOneWidget);
27 | });
28 | }
29 |
--------------------------------------------------------------------------------
/lib/Widgets/Dashboard/complete_todo_list.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:provider/provider.dart';
3 | import 'package:todo_app/provider/todos_provider.dart';
4 |
5 | import 'complete_todo_card.dart';
6 |
7 | class CompleteTodoList extends StatefulWidget {
8 | const CompleteTodoList({Key? key}) : super(key: key);
9 |
10 | @override
11 | _CompleteTodoListState createState() => _CompleteTodoListState();
12 | }
13 |
14 | class _CompleteTodoListState extends State {
15 | @override
16 | Widget build(BuildContext context) {
17 | return Padding(
18 | padding: const EdgeInsets.only(top: 20.0),
19 | child: Consumer(
20 | builder: (context, state, child) => SizedBox(
21 | height: MediaQuery.of(context).size.height / 1.65,
22 | child: ListView.builder(
23 | itemCount: state.completedTodos.length,
24 | itemBuilder: (context, index) {
25 | return CompleteTodoCard(
26 | todo: state.completedTodos[index],
27 | );
28 | }),
29 | ),
30 | ),
31 | );
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
17 |
20 |
--------------------------------------------------------------------------------
/lib/Widgets/ChangeName/change_name_text.dart:
--------------------------------------------------------------------------------
1 | import 'package:easy_localization/easy_localization.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:todo_app/translations/locale_keys.g.dart';
4 |
5 | class ChangeNameText extends StatelessWidget {
6 | const ChangeNameText({Key? key}) : super(key: key);
7 |
8 | @override
9 | Widget build(BuildContext context) {
10 | return Padding(
11 | padding: const EdgeInsets.only(top: 10),
12 | child: Column(
13 | children: [
14 | Padding(
15 | padding: EdgeInsets.only(top: 10.0, left: 10, right: 10),
16 | child: Text(
17 | LocaleKeys.changename_title.tr(),
18 | style: TextStyle(
19 | fontSize: 25,
20 | fontWeight: FontWeight.bold,
21 | color: Colors.black),
22 | ),
23 | ),
24 | Padding(
25 | padding: const EdgeInsets.only(top: 20.0),
26 | child: Image.asset(
27 | 'lib/img/businessman-min.png',
28 | width: 170,
29 | ),
30 | ),
31 | ],
32 | ));
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/lib/Models/todo.dart:
--------------------------------------------------------------------------------
1 | class Todo {
2 | String title;
3 | String description;
4 | bool complete = false;
5 | String category;
6 | int dateMilliseconds;
7 | int timeMilliseconds;
8 |
9 | Todo(
10 | {required this.title,
11 | this.description = '',
12 | this.complete = false,
13 | required this.dateMilliseconds,
14 | required this.timeMilliseconds,
15 | this.category = 'Uncategorized'});
16 |
17 | //toObject
18 | Todo.fromMap(Map map)
19 | : title = map['title'] as String,
20 | description = map['description'] as String,
21 | complete = map['complete'] as bool,
22 | category = map['category'] as String,
23 | dateMilliseconds = map['dateMilliseconds'] as int,
24 | timeMilliseconds = map['timeMilliseconds'] as int;
25 |
26 | //toJson
27 | Map toJson() {
28 | final Map data = {};
29 | data['title'] = title;
30 | data['description'] = description;
31 | data['complete'] = complete;
32 | data['category'] = category;
33 | data['dateMilliseconds'] = dateMilliseconds;
34 | data['timeMilliseconds'] = timeMilliseconds;
35 | return data;
36 | }
37 |
38 | void toggleCompleted() {
39 | complete = !complete;
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/lib/Pages/dashboard_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:easy_localization/easy_localization.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:hexcolor/hexcolor.dart';
4 | import 'package:todo_app/Widgets/Dashboard/complete_todo_list.dart';
5 | import 'package:todo_app/Widgets/Dashboard/completed_task_info.dart';
6 | import 'package:todo_app/translations/locale_keys.g.dart';
7 |
8 | class DashboardPage extends StatefulWidget {
9 | const DashboardPage({Key? key}) : super(key: key);
10 |
11 | @override
12 | _DashboardPageState createState() => _DashboardPageState();
13 | }
14 |
15 | class _DashboardPageState extends State {
16 | @override
17 | Widget build(BuildContext context) {
18 | return Scaffold(
19 | appBar: dashboardAB(),
20 | body: Container(
21 | color: HexColor('#f9f6e8'),
22 | child: Column(
23 | children: const [CompletedTaskInfo(), CompleteTodoList()],
24 | ),
25 | ),
26 | );
27 | }
28 | }
29 |
30 | AppBar dashboardAB() {
31 | return AppBar(
32 | centerTitle: true,
33 | backgroundColor: HexColor('#f9f6e8'),
34 | elevation: 0,
35 | title: Text(
36 | LocaleKeys.dashboard_title.tr(),
37 | style: TextStyle(fontSize: 25, color: Colors.black),
38 | ),
39 | );
40 | }
41 |
--------------------------------------------------------------------------------
/lib/Widgets/Welcome/welcome_tf.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class WelcomCustomTF extends StatelessWidget {
4 | WelcomCustomTF({Key? key, required this.controller, required this.labelText})
5 | : super(key: key);
6 |
7 | String labelText;
8 | TextEditingController controller;
9 |
10 | @override
11 | Widget build(BuildContext context) {
12 | return Padding(
13 | padding: const EdgeInsets.only(left: 2.0, right: 2.0, top: 20.0),
14 | child: TextFormField(
15 | maxLength: 15,
16 | controller: controller,
17 | validator: (value) {
18 | if (value!.isEmpty) {
19 | return 'Please enter $labelText';
20 | }
21 | },
22 | decoration: InputDecoration(
23 | border: OutlineInputBorder(
24 | borderSide: BorderSide.none,
25 | borderRadius: BorderRadius.circular(10.0),
26 | ),
27 | fillColor: Colors.amber.shade50,
28 | filled: true,
29 | suffixIcon: IconButton(
30 | icon: const Icon(
31 | Icons.clear_outlined,
32 | size: 20,
33 | color: Colors.red,
34 | ),
35 | onPressed: () {
36 | controller.text = '';
37 | },
38 | ),
39 | hintText: labelText,
40 | ),
41 | ),
42 | );
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/ios/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment this line to define a global platform for your project
2 | # platform :ios, '9.0'
3 |
4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true'
6 |
7 | project 'Runner', {
8 | 'Debug' => :debug,
9 | 'Profile' => :release,
10 | 'Release' => :release,
11 | }
12 |
13 | def flutter_root
14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
15 | unless File.exist?(generated_xcode_build_settings_path)
16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
17 | end
18 |
19 | File.foreach(generated_xcode_build_settings_path) do |line|
20 | matches = line.match(/FLUTTER_ROOT\=(.*)/)
21 | return matches[1].strip if matches
22 | end
23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
24 | end
25 |
26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
27 |
28 | flutter_ios_podfile_setup
29 |
30 | target 'Runner' do
31 | use_frameworks!
32 | use_modular_headers!
33 |
34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
35 | end
36 |
37 | post_install do |installer|
38 | installer.pods_project.targets.each do |target|
39 | flutter_additional_ios_build_settings(target)
40 | end
41 | end
42 |
--------------------------------------------------------------------------------
/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | # This file configures the analyzer, which statically analyzes Dart code to
2 | # check for errors, warnings, and lints.
3 | #
4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled
5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
6 | # invoked from the command line by running `flutter analyze`.
7 |
8 | # The following line activates a set of recommended lints for Flutter apps,
9 | # packages, and plugins designed to encourage good coding practices.
10 | include: package:flutter_lints/flutter.yaml
11 |
12 | linter:
13 | # The lint rules applied to this project can be customized in the
14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml`
15 | # included above or to enable additional rules. A list of all available lints
16 | # and their documentation is published at
17 | # https://dart-lang.github.io/linter/lints/index.html.
18 | #
19 | # Instead of disabling a lint rule for the entire project in the
20 | # section below, it can also be suppressed for a single line of code
21 | # or a specific dart file by using the `// ignore: name_of_lint` and
22 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file
23 | # producing the lint.
24 | rules:
25 | # avoid_print: false # Uncomment to disable the `avoid_print` rule
26 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
27 |
28 | # Additional information about this file can be found at
29 | # https://dart.dev/guides/language/analysis-options
30 |
--------------------------------------------------------------------------------
/lib/Widgets/Welcome/welcome_text.dart:
--------------------------------------------------------------------------------
1 | import 'package:easy_localization/easy_localization.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:todo_app/translations/locale_keys.g.dart';
4 |
5 | class welcomeText extends StatelessWidget {
6 | const welcomeText({Key? key}) : super(key: key);
7 |
8 | @override
9 | Widget build(BuildContext context) {
10 | return Padding(
11 | padding: const EdgeInsets.only(top: 20),
12 | child: Column(
13 | children: [
14 | Padding(
15 | padding: EdgeInsets.only(top: 10.0, left: 10, right: 10),
16 | child: Text(
17 | LocaleKeys.welcomescreen_title.tr(),
18 | style: TextStyle(
19 | fontSize: 25,
20 | fontWeight: FontWeight.bold,
21 | color: Colors.black),
22 | ),
23 | ),
24 | Padding(
25 | padding: const EdgeInsets.only(top: 20.0),
26 | child: Image.asset(
27 | 'lib/img/businessman-min.png',
28 | width: 170,
29 | ),
30 | ),
31 | Padding(
32 | padding: EdgeInsets.only(top: 10.0, left: 15, right: 15),
33 | child: Text(
34 | LocaleKeys.welcomescreen_subtitle.tr(),
35 | style: TextStyle(
36 | fontSize: 16,
37 | fontWeight: FontWeight.bold,
38 | color: Colors.black),
39 | textAlign: TextAlign.center,
40 | ),
41 | ),
42 | ],
43 | ));
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:easy_localization/easy_localization.dart';
2 | import 'package:flutter/cupertino.dart';
3 | import 'package:flutter/material.dart';
4 | import 'package:flutter/services.dart';
5 | import 'package:hexcolor/hexcolor.dart';
6 | import 'package:provider/provider.dart';
7 | import 'package:todo_app/Pages/main_screen.dart';
8 | import 'package:todo_app/Pages/welcome_screen.dart';
9 | import 'package:todo_app/provider/todos_provider.dart';
10 | import 'package:todo_app/translations/codegen_loader.g.dart';
11 |
12 | void main() async {
13 | WidgetsFlutterBinding.ensureInitialized();
14 | await EasyLocalization.ensureInitialized();
15 | TodosProvider().initSharedPreferences();
16 | var userName = await TodosProvider().readName('userName');
17 | await SystemChrome.setPreferredOrientations([
18 | DeviceOrientation.portraitUp,
19 | DeviceOrientation.portraitDown,
20 | ]);
21 | runApp(
22 | ChangeNotifierProvider(
23 | create: (BuildContext context) => TodosProvider(),
24 | child: EasyLocalization(
25 | path: 'lib/langs',
26 | supportedLocales: [
27 | Locale('en'),
28 | Locale('tr'),
29 | ],
30 | assetLoader: CodegenLoader(),
31 | fallbackLocale: Locale('en'),
32 | child: MyApp(
33 | userName: userName.toString(),
34 | ),
35 | ),
36 | ),
37 | );
38 | }
39 |
40 | class MyApp extends StatelessWidget {
41 | const MyApp({Key? key, required this.userName}) : super(key: key);
42 | final userName;
43 |
44 | @override
45 | Widget build(BuildContext context) {
46 | return MaterialApp(
47 | title: 'Todo Moon',
48 | debugShowCheckedModeBanner: false,
49 | locale: context.locale,
50 | supportedLocales: context.supportedLocales,
51 | theme: ThemeData(
52 | primaryColor: HexColor('#f9f6e8'),
53 | ),
54 | localizationsDelegates: context.localizationDelegates,
55 | home: userName.toString().contains('null')
56 | ? const WelcomeScreen()
57 | : const MainScreen(),
58 | );
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleDisplayName
8 | Todo Moon
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleLocalizations
16 |
17 | en
18 | tr
19 |
20 | CFBundleName
21 | todo_app
22 | CFBundlePackageType
23 | APPL
24 | CFBundleShortVersionString
25 | $(MARKETING_VERSION)
26 | CFBundleSignature
27 | ????
28 | CFBundleVersion
29 | $(CURRENT_PROJECT_VERSION)
30 | LSRequiresIPhoneOS
31 |
32 | NSPhotoLibraryUsageDescription
33 | App needs access to photo lib for profile images
34 | UIBackgroundModes
35 |
36 | remote-notification
37 |
38 | UILaunchStoryboardName
39 | LaunchScreen
40 | UIMainStoryboardFile
41 | Main
42 | UIStatusBarHidden
43 |
44 | UISupportedInterfaceOrientations
45 |
46 | UIInterfaceOrientationPortrait
47 |
48 | UISupportedInterfaceOrientations~ipad
49 |
50 | UIInterfaceOrientationPortrait
51 | UIInterfaceOrientationPortraitUpsideDown
52 | UIInterfaceOrientationLandscapeLeft
53 | UIInterfaceOrientationLandscapeRight
54 |
55 | UIViewControllerBasedStatusBarAppearance
56 |
57 | CADisableMinimumFrameDurationOnPhone
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/lib/langs/en.json:
--------------------------------------------------------------------------------
1 | {
2 | "homescreen": {
3 | "hello_text": "Hello",
4 | "subtitle_text": "How is your work life balance this week?",
5 | "goodjob_text": "Good Job {}!",
6 | "goodjob_subtitle_text": "Your life is well-balanced",
7 | "taskstitle": "Your tasks",
8 | "taskssubtitle": "You have {} tasks for {}"
9 | },
10 | "dashboard": {
11 | "tasktitle": "Your tasks",
12 | "taskssubtitle": "You have {} tasks completed all time",
13 | "alertdialog": {
14 | "title": "Are you sure?",
15 | "subtitle": "You do realize that all todos you complete will be deleted, right?",
16 | "delete": "Delete completed todos!",
17 | "cancel": "Cancel"
18 | },
19 | "title": "Dashboard"
20 | },
21 | "profile": {
22 | "completed_text": "Completed",
23 | "uncompleted_text": "Uncomplete",
24 | "alltasks_text": "All Tasks",
25 | "title": "Profile",
26 | "stats": "Statistics"
27 | },
28 | "changename": {
29 | "name_tf": "Name",
30 | "surname_tf": "Surname",
31 | "title": "Change Name",
32 | "cancel_btn": "Cancel",
33 | "done_btn": "Done"
34 | },
35 | "addtodo": {
36 | "title": "Add Todo",
37 | "title_tf": "Title",
38 | "desc_tf": "Description",
39 | "category_tf": "Category",
40 | "date": "Select Date\nDefault Date: {}",
41 | "time": "Select Time\nDefault Time : {}",
42 | "add_btn": "Add Todo",
43 | "cancel_btn": "Cancel",
44 | "selected": "Selected {}",
45 | "error_text": "Please enter {}"
46 | },
47 | "edittodo": {
48 | "title": "Edit Task",
49 | "title_tf": "Title",
50 | "category_tf": "Category",
51 | "desc_tf": "Description",
52 | "selecteddate": "Selected Date : {}",
53 | "selectedtime": "Selected Time : {}",
54 | "default_date": "Task Date : {}",
55 | "default_time": "Task Time : {}",
56 | "edit_btn": "Finish editing",
57 | "close_btn": "Close"
58 | },
59 | "welcomescreen": {
60 | "title": "Welcome",
61 | "subtitle": "Please provide your name and surname to address you",
62 | "done_button": "Done",
63 | "name_tf": "Name",
64 | "surname_tf": "Surname"
65 | }
66 | }
--------------------------------------------------------------------------------
/lib/Widgets/Profile/todos_big_container.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_screenutil/flutter_screenutil.dart';
3 | import 'package:hexcolor/hexcolor.dart';
4 | import 'package:provider/provider.dart';
5 |
6 | import '../../provider/todos_provider.dart';
7 |
8 | class TodosBigContainer extends StatelessWidget {
9 | TodosBigContainer(
10 | {Key? key,
11 | required this.containerHeight,
12 | required this.containerWidth,
13 | required this.numberfontSize,
14 | required this.textfontSize,
15 | required this.backgroundColor,
16 | required this.text})
17 | : super(key: key);
18 |
19 | double containerHeight;
20 | double containerWidth;
21 | double numberfontSize;
22 | double textfontSize;
23 | String backgroundColor;
24 | String text;
25 | @override
26 | Widget build(BuildContext context) {
27 | return Consumer(
28 | builder: (context, state, child) {
29 | return Container(
30 | height: containerHeight,
31 | width: containerWidth,
32 | decoration: BoxDecoration(
33 | color: HexColor(backgroundColor),
34 | borderRadius: const BorderRadius.all(
35 | Radius.circular(14.0),
36 | ),
37 | ),
38 | child: Column(
39 | mainAxisAlignment: MainAxisAlignment.center,
40 | crossAxisAlignment: CrossAxisAlignment.center,
41 | children: [
42 | Text(
43 | text,
44 | style: TextStyle(
45 | color: HexColor('#393939'),
46 | fontSize: textfontSize,
47 | fontWeight: FontWeight.w600),
48 | ),
49 | SizedBox(height: 10.h),
50 | Text(
51 | '${state.allTodos.length}',
52 | style: TextStyle(
53 | color: HexColor('#393939'),
54 | fontSize: numberfontSize,
55 | fontWeight: FontWeight.w700),
56 | ),
57 | ],
58 | ),
59 | );
60 | },
61 | );
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/lib/Widgets/Dashboard/completed_task_info.dart:
--------------------------------------------------------------------------------
1 | import 'package:easy_localization/easy_localization.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:provider/provider.dart';
4 | import 'package:todo_app/provider/todos_provider.dart';
5 | import 'package:todo_app/translations/locale_keys.g.dart';
6 |
7 | import 'clear_todos_btn.dart';
8 |
9 | class CompletedTaskInfo extends StatefulWidget {
10 | const CompletedTaskInfo({Key? key}) : super(key: key);
11 |
12 | @override
13 | _Task_InfoState createState() => _Task_InfoState();
14 | }
15 |
16 | // ignore: camel_case_types
17 | class _Task_InfoState extends State {
18 | @override
19 | Widget build(BuildContext context) {
20 | return Padding(
21 | padding: const EdgeInsets.symmetric(horizontal: 24.0),
22 | child: Row(
23 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
24 | children: [
25 | Padding(
26 | padding: const EdgeInsets.only(top: 5.0),
27 | child: Column(
28 | crossAxisAlignment: CrossAxisAlignment.start,
29 | children: [
30 | Row(
31 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
32 | children: [
33 | Text(
34 | LocaleKeys.dashboard_tasktitle.tr(),
35 | style:
36 | TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
37 | ),
38 | ClearTodosBtn(),
39 | ],
40 | ),
41 | Consumer(
42 | builder: (context, state, child) => Text(
43 | LocaleKeys.dashboard_taskssubtitle
44 | .tr(args: ['${state.completedTodos.length}']),
45 | style: const TextStyle(
46 | fontSize: 14,
47 | fontWeight: FontWeight.bold,
48 | color: Colors.grey),
49 | ),
50 | )
51 | ],
52 | ),
53 | ),
54 | ],
55 | ),
56 | );
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/lib/langs/tr.json:
--------------------------------------------------------------------------------
1 | {
2 | "homescreen": {
3 | "hello_text": "Merhaba",
4 | "subtitle_text": "Bu hafta iş yaşam dengeniz nasıl?",
5 | "goodjob_text": "İyi iş {}!",
6 | "goodjob_subtitle_text": "Hayatınız gayet dengeli",
7 | "taskstitle": "İşleriniz",
8 | "taskssubtitle": "{} tarihi için {} işiniz var"
9 | },
10 | "dashboard": {
11 | "tasktitle": "İşleriniz",
12 | "taskssubtitle": "Toplamda {} tane iş bitirmişsiniz",
13 | "alertdialog": {
14 | "title": "Emin misiniz?",
15 | "subtitle": "Tamamlanmış tüm işleriniz silinecek. Bunun farkındasınız değil mi?",
16 | "delete": "Tamamlanmış tüm işleri sil!",
17 | "cancel": "Vazgeç"
18 | },
19 | "title": "Panel"
20 | },
21 | "profile": {
22 | "completed_text": "Tamamlanmış",
23 | "uncompleted_text": "Tamamlanmamış",
24 | "alltasks_text": "Tüm İşleriniz",
25 | "title": "Profil",
26 | "stats": "İstatistik"
27 | },
28 | "changename": {
29 | "name_tf": "İsim",
30 | "surname_tf": "Soyad",
31 | "title": "İsminizi Değiştirin",
32 | "cancel_btn": "Vazgeç",
33 | "done_btn": "Değiştir"
34 | },
35 | "addtodo": {
36 | "title": "İş Ekle",
37 | "title_tf": "Başlık",
38 | "desc_tf": "Açıklama",
39 | "category_tf": "Kategori",
40 | "date": "Tarih Seçin\nVarsayılan Tarih: {}",
41 | "time": "Saat Seçin\nVarsayılan Saat: {}",
42 | "add_btn": "İş Ekle",
43 | "cancel_btn": "Vazgeç",
44 | "selected": "Seçilen {}",
45 | "error_text": "Lütfen {} giriniz"
46 | },
47 | "edittodo": {
48 | "title": "İşi Düzenle",
49 | "title_tf": "Başlık",
50 | "category_tf": "Kategori",
51 | "desc_tf": "Açıklama",
52 | "selecteddate": "Seçilen Tarih : {}",
53 | "selectedtime": "Seçilen Saat : {}",
54 | "default_date": "İşin Tarihi : {}",
55 | "default_time": "İşin Saati : {}",
56 | "edit_btn": "Düzenlemeyi bitir",
57 | "close_btn": "Kapat"
58 | },
59 | "welcomescreen": {
60 | "title": "Hoşgeldin",
61 | "subtitle": "Size hitap etmek için lütfen adınızı ve soyadınızı belirtin",
62 | "done_button": "Tamam",
63 | "name_tf": "İsim",
64 | "surname_tf": "Soyad"
65 | }
66 | }
--------------------------------------------------------------------------------
/lib/Review/review_service.dart:
--------------------------------------------------------------------------------
1 | import 'package:in_app_review/in_app_review.dart';
2 | import 'package:shared_preferences/shared_preferences.dart';
3 | import 'package:todo_app/provider/shared_prefences_helper.dart';
4 |
5 | const KEY = 'FIRST_TIME_OPEN';
6 | const COUNTER = 'OPEN_COUNTER';
7 |
8 | class ReviewService {
9 | late SharedPreferences _sharedPreferences;
10 | late int openCounter;
11 |
12 | final InAppReview _inAppReview = InAppReview.instance;
13 | Future isSecondTimeOpen() async {
14 | _sharedPreferences = await SharedPreferencesHelper.instance;
15 | openCounter = _sharedPreferences.getInt(COUNTER) ?? 1;
16 | try {
17 | dynamic isSecondTime = _sharedPreferences.getBool(KEY);
18 | if (openCounter == 3) {
19 | _sharedPreferences.setBool(KEY, true);
20 | openCounter += 1;
21 | _sharedPreferences.setInt(COUNTER, openCounter);
22 | return true;
23 | } else if (openCounter == 15) {
24 | _sharedPreferences.setBool(KEY, true);
25 | openCounter += 1;
26 | _sharedPreferences.setInt(COUNTER, openCounter);
27 | return true;
28 | } else if (openCounter == 150) {
29 | _sharedPreferences.setBool(KEY, true);
30 | openCounter += 1;
31 | _sharedPreferences.setInt(COUNTER, openCounter);
32 | return true;
33 | } else if (openCounter == 400) {
34 | _sharedPreferences.setBool(KEY, true);
35 | openCounter += 1;
36 | _sharedPreferences.setInt(COUNTER, openCounter);
37 | return true;
38 | } else {
39 | _sharedPreferences.setBool(KEY, false);
40 | openCounter += 1;
41 | _sharedPreferences.setInt(COUNTER, openCounter);
42 | return false;
43 | }
44 | } catch (e) {
45 | return false;
46 | }
47 | }
48 |
49 | Future showRating() async {
50 | try {
51 | final available = await _inAppReview.isAvailable();
52 | if (available) {
53 | _inAppReview.requestReview();
54 | } else {
55 | _inAppReview.openStoreListing(
56 | appStoreId: 'com.yagizdokumaci.todomoon',
57 | );
58 | }
59 | return true;
60 | } catch (e) {
61 | return false;
62 | }
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/lib/Widgets/Todo/todo_list.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:provider/provider.dart';
3 | import 'package:todo_app/Widgets/Todo/todo_card.dart';
4 | import 'package:todo_app/provider/todos_provider.dart';
5 |
6 | class TodoWidget extends StatefulWidget {
7 | const TodoWidget({Key? key}) : super(key: key);
8 |
9 | @override
10 | _TodoWidgetState createState() => _TodoWidgetState();
11 | }
12 |
13 | class _TodoWidgetState extends State {
14 | @override
15 | void initState() {
16 | super.initState();
17 | }
18 |
19 | @override
20 | Widget build(BuildContext context) {
21 | return Consumer(
22 | builder: (context, state, child) => SizedBox(
23 | height: MediaQuery.of(context).size.height / 2.68,
24 | child: ListView.builder(
25 | itemCount: state.unCompletedTodos.where((Todo) {
26 | return DateTime.fromMillisecondsSinceEpoch(Todo.dateMilliseconds)
27 | .day ==
28 | DateTime.now().day &&
29 | DateTime.fromMillisecondsSinceEpoch(Todo.dateMilliseconds)
30 | .month ==
31 | DateTime.now().month &&
32 | DateTime.fromMillisecondsSinceEpoch(Todo.dateMilliseconds)
33 | .year ==
34 | DateTime.now().year;
35 | }).length,
36 | itemBuilder: (context, index) {
37 | return TodoCard(
38 | todo: state.unCompletedTodos.where((Todo) {
39 | return DateTime.fromMillisecondsSinceEpoch(
40 | Todo.dateMilliseconds)
41 | .day ==
42 | DateTime.now().day &&
43 | DateTime.fromMillisecondsSinceEpoch(Todo.dateMilliseconds)
44 | .month ==
45 | DateTime.now().month &&
46 | DateTime.fromMillisecondsSinceEpoch(Todo.dateMilliseconds)
47 | .year ==
48 | DateTime.now().year;
49 | }).toList()[index],
50 | );
51 | }),
52 | ),
53 | );
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
14 |
18 |
22 |
27 |
31 |
32 |
33 |
34 |
35 |
36 |
38 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/lib/Widgets/Todo/edit_tf.dart:
--------------------------------------------------------------------------------
1 | import 'package:easy_localization/easy_localization.dart';
2 | import 'package:flutter/material.dart';
3 |
4 | import '../../translations/locale_keys.g.dart';
5 |
6 | class EditTF extends StatelessWidget {
7 | EditTF(
8 | {Key? key,
9 | required this.hint,
10 | required this.controller,
11 | required this.labelText})
12 | : super(key: key);
13 |
14 | String labelText;
15 | String hint;
16 | TextEditingController controller;
17 |
18 | @override
19 | Widget build(BuildContext context) {
20 | return Padding(
21 | padding: const EdgeInsets.only(left: 20.0, right: 20.0, top: 15.0),
22 | child: TextFormField(
23 | textInputAction: labelText.contains(LocaleKeys.edittodo_desc_tf.tr()) ||
24 | labelText.contains(LocaleKeys.edittodo_title_tf.tr())
25 | ? TextInputAction.next
26 | : TextInputAction.done,
27 | maxLength: labelText.contains(LocaleKeys.addtodo_title_tf.tr())
28 | ? 15
29 | : labelText.contains(LocaleKeys.edittodo_category_tf.tr())
30 | ? 15
31 | : 250,
32 | maxLines:
33 | labelText.contains(LocaleKeys.edittodo_desc_tf.tr()) ? null : 1,
34 | controller: controller,
35 | validator: (value) {
36 | if (labelText.contains(LocaleKeys.edittodo_title_tf.tr())) {
37 | if (value!.isEmpty
38 | // || RegExp(r"\s").hasMatch(value.toString())
39 | ) {
40 | return LocaleKeys.addtodo_error_text.tr(args: [labelText]);
41 | }
42 | }
43 | },
44 | decoration: InputDecoration(
45 | border: OutlineInputBorder(
46 | borderSide: BorderSide.none,
47 | borderRadius: BorderRadius.circular(10.0),
48 | ),
49 | fillColor: Colors.amber.shade50,
50 | filled: true,
51 | suffixIcon: IconButton(
52 | icon: const Icon(
53 | Icons.clear_outlined,
54 | size: 20,
55 | color: Colors.red,
56 | ),
57 | onPressed: () {
58 | controller.text = '';
59 | },
60 | ),
61 | hintText: labelText,
62 | hintStyle: const TextStyle(color: Colors.black)),
63 | ),
64 | );
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/lib/Widgets/Todo/custom_tf.dart:
--------------------------------------------------------------------------------
1 | import 'package:easy_localization/easy_localization.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:todo_app/translations/locale_keys.g.dart';
4 |
5 | class CustomTF extends StatelessWidget {
6 | CustomTF(
7 | {Key? key,
8 | required this.hint,
9 | required this.controller,
10 | required this.labelText})
11 | : super(key: key);
12 |
13 | String labelText;
14 | String hint;
15 | TextEditingController controller;
16 |
17 | @override
18 | Widget build(BuildContext context) {
19 | return Padding(
20 | padding: const EdgeInsets.only(left: 20.0, right: 20.0, top: 15.0),
21 | child: TextFormField(
22 | textInputAction: labelText.contains(LocaleKeys.addtodo_desc_tf.tr()) ||
23 | labelText.contains(LocaleKeys.addtodo_title_tf.tr())
24 | ? TextInputAction.next
25 | : TextInputAction.done,
26 | maxLength: labelText.contains(LocaleKeys.addtodo_title_tf.tr())
27 | ? 15
28 | : labelText.contains(LocaleKeys.addtodo_category_tf.tr())
29 | ? 15
30 | : 250,
31 | maxLines:
32 | labelText.contains(LocaleKeys.addtodo_desc_tf.tr()) ? null : 1,
33 | controller: controller,
34 | validator: (value) {
35 | if (labelText.contains(LocaleKeys.addtodo_title_tf.tr())) {
36 | if (value!.isEmpty
37 | //|| RegExp(r"\s").hasMatch(value.toString(),)
38 | ) {
39 | return LocaleKeys.addtodo_error_text.tr(args: [labelText]);
40 | }
41 | }
42 | },
43 | decoration: InputDecoration(
44 | border: OutlineInputBorder(
45 | borderSide: BorderSide.none,
46 | borderRadius: BorderRadius.circular(10.0),
47 | ),
48 | fillColor: Colors.amber.shade50,
49 | filled: true,
50 | suffixIcon: IconButton(
51 | icon: const Icon(
52 | Icons.clear_outlined,
53 | size: 20,
54 | color: Colors.red,
55 | ),
56 | onPressed: () {
57 | controller.text = '';
58 | },
59 | ),
60 | hintText: labelText,
61 | hintStyle: const TextStyle(color: Colors.black)),
62 | ),
63 | );
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/lib/Widgets/Profile/todos_stats_comp.dart:
--------------------------------------------------------------------------------
1 | import 'package:easy_localization/easy_localization.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:flutter_screenutil/flutter_screenutil.dart';
4 | import 'package:hexcolor/hexcolor.dart';
5 | import 'package:todo_app/Widgets/Profile/todos_big_container.dart';
6 | import 'package:todo_app/Widgets/Profile/todos_container.dart';
7 |
8 | import '../../translations/locale_keys.g.dart';
9 |
10 | class TodosStats extends StatelessWidget {
11 | const TodosStats({Key? key}) : super(key: key);
12 |
13 | @override
14 | Widget build(BuildContext context) {
15 | return Stack(
16 | fit: StackFit.expand,
17 | children: [
18 | Padding(
19 | padding: EdgeInsets.only(left: 18.w),
20 | child: Text(
21 | LocaleKeys.profile_stats.tr(),
22 | style: TextStyle(
23 | fontWeight: FontWeight.bold,
24 | fontSize: 20.w,
25 | color: HexColor('#393939'),
26 | ),
27 | ),
28 | ),
29 | // Completed Todos
30 | Positioned(
31 | top: 50.h,
32 | left: 20.w,
33 | child: TodosContainer(
34 | containerHeight: 160.h,
35 | containerWidth: 160.w,
36 | numberfontSize: 45.w,
37 | textfontSize: 22.w,
38 | backgroundColor: '#FF9D78',
39 | text: LocaleKeys.profile_completed_text.tr(),
40 | ),
41 | ),
42 |
43 | // Uncompleted Todos
44 | Positioned(
45 | top: 50.h,
46 | left: 205.w,
47 | child: TodosContainer(
48 | containerHeight: 160.h,
49 | containerWidth: 160.w,
50 | numberfontSize: 45.w,
51 | textfontSize: context.locale == Locale('en') ? 22.w : 18.w,
52 | backgroundColor: '#FFC8B4',
53 | text: LocaleKeys.profile_uncompleted_text.tr(),
54 | ),
55 | ),
56 |
57 | // All Todos
58 | Positioned(
59 | top: 240.h,
60 | left: 20.w,
61 | child: TodosBigContainer(
62 | containerHeight: 160.h,
63 | containerWidth: 345.w,
64 | numberfontSize: 45.w,
65 | textfontSize: 22.w,
66 | backgroundColor: '#F9F6E9',
67 | text: LocaleKeys.profile_alltasks_text.tr(),
68 | ),
69 | )
70 | ],
71 | );
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Flutter - Todo App
2 |
3 | Todo App I made with Flutter.
4 |
5 | Desing : https://dribbble.com/shots/8935948-Work-life-Balance-app
6 |
7 | #### App Store
8 |
9 |
10 | #### Google Play
11 |
12 |
13 |
14 | ## Run Locally
15 |
16 | Clone the project
17 |
18 | ```bash
19 | git clone https://github.com/yagizdo/Todo-Moon
20 | ```
21 |
22 | Go to the project directory
23 |
24 | ```bash
25 | cd Todo-Moon
26 | ```
27 |
28 | Install dependencies
29 |
30 | ```bash
31 | flutter pub get
32 | ```
33 |
34 | Run App
35 |
36 | ```bash
37 | flutter run
38 | ```
39 |
40 |
41 | ## What will be add :question:
42 |
43 | - [x] Dynamic Todos
44 | - [x] HomePage UI
45 | - [X] Add Todo Page
46 | - [x] Shared Preferences for Add Todo Page
47 | - [x] State Management (Provider)
48 | - [ ] Dark Mode
49 | - [x] Splash Screen
50 |
51 |
52 | ## Libraries I use in the application:
53 | - Provider : https://pub.dev/packages/provider
54 | - Shared Preferences : https://pub.dev/packages/shared_preferences
55 | - Slidable : https://pub.dev/packages/flutter_slidable
56 | - Font Awesome Flutter : https://pub.dev/packages/font_awesome_flutter
57 | - Hex Color : https://pub.dev/packages/hexcolor
58 | - Percent Indicator : https://pub.dev/packages/percent_indicator
59 | - Flutter Toast : https://pub.dev/packages/fluttertoast
60 | - Flutter Launcher Icons : https://pub.dev/packages/flutter_launcher_icons
61 | - Modal Bottom Sheet : https://pub.dev/packages/modal_bottom_sheet
62 | - Flutter Native Splash : https://pub.dev/packages/flutter_native_splash
63 |
64 |
65 |
66 | ## App Video
67 |
68 |
69 | https://user-images.githubusercontent.com/31064552/183441566-ade1c1c1-81fa-4b75-844b-2d762a11a61e.mp4
70 |
71 |
72 | ## Contributing
73 |
74 | Contributions are always welcome!
75 |
--------------------------------------------------------------------------------
/lib/Widgets/HomePage/Grettings/greetings.dart:
--------------------------------------------------------------------------------
1 | import 'package:auto_size_text/auto_size_text.dart';
2 | import 'package:easy_localization/easy_localization.dart';
3 | import 'package:flutter/material.dart';
4 | import 'package:hexcolor/hexcolor.dart';
5 | import 'package:provider/provider.dart';
6 | import 'package:todo_app/provider/todos_provider.dart';
7 |
8 | import '../../../translations/locale_keys.g.dart';
9 |
10 | // Welcome Text Widget
11 | Widget _welcomeText(
12 | String text, double size, FontWeight fontWeight, Color color) {
13 | return AutoSizeText(
14 | text,
15 | style: TextStyle(
16 | fontSize: size,
17 | fontWeight: fontWeight,
18 | color: color,
19 | ),
20 | maxLines: 1,
21 | );
22 | }
23 |
24 | // ignore: must_be_immutable
25 | class Greetings extends StatelessWidget {
26 | Greetings({Key? key, required this.customFontSize}) : super(key: key);
27 | double customFontSize;
28 | @override
29 | Widget build(BuildContext context) {
30 | return Column(
31 | children: [
32 | SizedBox(
33 | height: MediaQuery.of(context).size.height / 18,
34 | ),
35 | Container(
36 | height: MediaQuery.of(context).size.height / 7.5,
37 | color: HexColor('#f9f6e8'),
38 | child: Column(children: [
39 | Row(
40 | mainAxisAlignment: MainAxisAlignment.center,
41 | children: [
42 | _welcomeText(LocaleKeys.homescreen_hello_text.tr(),
43 | customFontSize, FontWeight.normal, Colors.black),
44 | Consumer(
45 | builder: (context, state, child) => Padding(
46 | padding: const EdgeInsets.only(left: 5.0),
47 | child: _welcomeText(state.name, customFontSize,
48 | FontWeight.bold, Colors.black),
49 | ),
50 | ),
51 | ],
52 | ),
53 | Row(
54 | mainAxisAlignment: MainAxisAlignment.center,
55 | children: [
56 | Padding(
57 | padding: const EdgeInsets.only(top: 10.0),
58 | child: _welcomeText(
59 | LocaleKeys.homescreen_subtitle_text.tr(),
60 | 15,
61 | FontWeight.normal,
62 | Colors.black,
63 | ),
64 | ),
65 | ],
66 | ),
67 | ]),
68 | ),
69 | ],
70 | );
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/lib/Widgets/Profile/name_text.dart:
--------------------------------------------------------------------------------
1 | import 'package:auto_size_text/auto_size_text.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:flutter_screenutil/flutter_screenutil.dart';
4 | import 'package:flutter_svg/svg.dart';
5 | import 'package:hexcolor/hexcolor.dart';
6 | import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
7 | import 'package:provider/provider.dart';
8 | import 'package:todo_app/provider/todos_provider.dart';
9 |
10 | import '../../Pages/change_name_page.dart';
11 | import "string_extension.dart";
12 |
13 | class NameText extends StatelessWidget {
14 | const NameText({Key? key}) : super(key: key);
15 |
16 | @override
17 | Widget build(BuildContext context) {
18 | return LayoutBuilder(builder: (context, constraints) {
19 | return Column(
20 | children: [
21 | // Name text top padding
22 | const SizedBox(
23 | height: 5,
24 | ),
25 | Row(
26 | mainAxisAlignment: MainAxisAlignment.center,
27 | children: [
28 | Consumer(
29 | builder: (context, state, child) => AutoSizeText(
30 | '${state.name.toTitleCase()} ${state.surname.toTitleCase()} ',
31 | maxLines: 1,
32 | style: TextStyle(
33 | fontSize: 20.w,
34 | fontWeight: FontWeight.w500,
35 | color: HexColor('#393939')),
36 | ),
37 | ),
38 | GestureDetector(
39 | onTap: () {
40 | /*Navigator.push(context,
41 | MaterialPageRoute(builder: (context) => ChangeNameScreen()));*/
42 | showCupertinoModalBottomSheet(
43 | shape: RoundedRectangleBorder(
44 | side: BorderSide.none,
45 | borderRadius: BorderRadius.circular(20.0),
46 | ),
47 | context: context,
48 | builder: (context) => SizedBox(
49 | height: MediaQuery.of(context).size.height / 1.2,
50 | child: const ChangeNameScreen()));
51 | },
52 | child: SvgPicture.asset(
53 | 'lib/img/cnameicon.svg',
54 | color: HexColor('#393939'),
55 | width: 15.w,
56 | ),
57 | ),
58 | ],
59 | )
60 | ],
61 | );
62 | });
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/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 = '4'
17 | }
18 |
19 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
20 | if (flutterVersionName == null) {
21 | flutterVersionName = '1.2'
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 | def keyProperties = new Properties()
29 | def keyPropertiesFile = rootProject.file('key.properties')
30 | if(keyPropertiesFile.exists()) {
31 | keyProperties.load(new FileInputStream(keyPropertiesFile))
32 | }
33 |
34 |
35 | android {
36 | compileSdkVersion 31
37 |
38 | compileOptions {
39 | sourceCompatibility JavaVersion.VERSION_1_8
40 | targetCompatibility JavaVersion.VERSION_1_8
41 | }
42 |
43 | kotlinOptions {
44 | jvmTarget = '1.8'
45 | }
46 |
47 | sourceSets {
48 | main.java.srcDirs += 'src/main/kotlin'
49 | }
50 |
51 | defaultConfig {
52 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
53 | applicationId "com.yagizdokumaci.todo_app"
54 | minSdkVersion 16
55 | targetSdkVersion 30
56 | versionCode flutterVersionCode.toInteger()
57 | versionName flutterVersionName
58 | }
59 |
60 | signingConfigs {
61 | release {
62 | keyAlias keyProperties['keyAlias']
63 | keyPassword keyProperties['keyPassword']
64 | storeFile file(keyProperties['storeFile'])
65 | storePassword keyProperties['storePassword']
66 | }
67 | }
68 |
69 | buildTypes {
70 | release {
71 | // TODO: Add your own signing config for the release build.
72 | // Signing with the debug keys for now, so `flutter run --release` works.
73 | signingConfig signingConfigs.release
74 | }
75 | }
76 | }
77 |
78 | flutter {
79 | source '../..'
80 | }
81 |
82 | dependencies {
83 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
84 | }
85 |
--------------------------------------------------------------------------------
/lib/Widgets/Profile/profile_circle.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_screenutil/flutter_screenutil.dart';
3 | import 'package:hexcolor/hexcolor.dart';
4 | import 'package:provider/provider.dart';
5 | import 'package:todo_app/provider/todos_provider.dart';
6 |
7 | import 'name_text.dart';
8 |
9 | class ProfileImg extends StatefulWidget {
10 | ProfileImg({Key? key, required this.avatarSize}) : super(key: key);
11 | double avatarSize;
12 |
13 | @override
14 | State createState() => _ProfileImgState();
15 | }
16 |
17 | class _ProfileImgState extends State {
18 | @override
19 | void initState() {
20 | super.initState();
21 | Provider.of(context, listen: false).base64ToImage();
22 | }
23 |
24 | @override
25 | Widget build(BuildContext context) {
26 | return Container(
27 | width: MediaQuery.of(context).size.width,
28 | child: Stack(
29 | children: [
30 | Column(
31 | children: [
32 | GestureDetector(
33 | onTap: () {
34 | setState(() {
35 | Provider.of(context, listen: false)
36 | .pickImage(context);
37 | });
38 | },
39 | child: Consumer(
40 | builder: (context, state, child) => state.profileImage != null
41 | ? CircleAvatar(
42 | backgroundImage: MemoryImage(state.profileImage!),
43 | radius: widget.avatarSize,
44 | )
45 | : CircleAvatar(
46 | child: Text(
47 | '${state.name[0].toUpperCase()}${state.surname[0].toUpperCase()}',
48 | style: const TextStyle(
49 | fontSize: 30, color: Colors.white),
50 | ),
51 | backgroundColor: HexColor('#ff9d73'),
52 | radius: widget.avatarSize,
53 | ),
54 | ),
55 | ),
56 | const NameText(),
57 | ],
58 | ),
59 | Positioned(
60 | top: 70.h,
61 | left: 215.w,
62 | child: Container(
63 | decoration: const BoxDecoration(
64 | color: Colors.white,
65 | borderRadius: BorderRadius.all(
66 | Radius.circular(40),
67 | ),
68 | ),
69 | child: Icon(
70 | Icons.add_circle,
71 | color: HexColor('#FFBA9D'),
72 | ),
73 | ),
74 | )
75 | ],
76 | ),
77 | );
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/lib/Pages/profile_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:easy_localization/easy_localization.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:flutter_screenutil/flutter_screenutil.dart';
4 | import 'package:hexcolor/hexcolor.dart';
5 | import 'package:todo_app/Widgets/Profile/profile_circle.dart';
6 | import 'package:todo_app/translations/locale_keys.g.dart';
7 |
8 | import '../Widgets/Profile/todos_stats_comp.dart';
9 |
10 | class ProfilePage extends StatelessWidget {
11 | const ProfilePage({Key? key}) : super(key: key);
12 |
13 | @override
14 | Widget build(BuildContext context) {
15 | return ScreenUtilInit(
16 | designSize: const Size(391, 850),
17 | builder: () => LayoutBuilder(builder: (context, constraints) {
18 | return Scaffold(
19 | backgroundColor: HexColor('#F9F6E9'),
20 | // App Bar
21 | appBar: AppBar(
22 | backgroundColor: HexColor('#F9F6E9'),
23 | title: Text(
24 | LocaleKeys.profile_title.tr(),
25 | style: TextStyle(color: Colors.black),
26 | ),
27 | elevation: 0,
28 | ),
29 | body: Stack(
30 | children: [
31 | Column(
32 | children: [
33 | Expanded(
34 | flex: 1,
35 | child: Container(
36 | color: HexColor('#F9F6E9'),
37 | ),
38 | ),
39 | // White Container
40 | Expanded(
41 | flex:
42 | // For Pixel 2 - height 633.4285714285714
43 | constraints.maxHeight == 633.4285714285714 ? 5 : 7,
44 | child: Container(
45 | decoration: const BoxDecoration(
46 | color: Colors.white,
47 | borderRadius: BorderRadius.only(
48 | topRight: Radius.circular(30.0),
49 | topLeft: Radius.circular(30.0),
50 | ),
51 | ),
52 | child: Padding(
53 | padding: EdgeInsets.only(
54 | top: constraints.maxHeight == 617 ||
55 | constraints.maxHeight == 518
56 | ? 120.h
57 | : 100.h),
58 | child: const TodosStats(),
59 | ),
60 | ),
61 | )
62 | ],
63 | ),
64 |
65 | // Profile Avatar
66 | Positioned(
67 | top: constraints.maxHeight == 617 ? 25.w : 40.w,
68 | child: ProfileImg(
69 | avatarSize: 45.w,
70 | ),
71 | )
72 | ],
73 | ),
74 | );
75 | }),
76 | );
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/lib/Widgets/Profile/todos_container.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_screenutil/flutter_screenutil.dart';
3 | import 'package:hexcolor/hexcolor.dart';
4 | import 'package:provider/provider.dart';
5 | import 'package:todo_app/provider/todos_provider.dart';
6 |
7 | class TodosContainer extends StatelessWidget {
8 | TodosContainer(
9 | {Key? key,
10 | required this.containerHeight,
11 | required this.containerWidth,
12 | required this.numberfontSize,
13 | required this.textfontSize,
14 | required this.backgroundColor,
15 | required this.text})
16 | : super(key: key);
17 | double containerHeight;
18 | double containerWidth;
19 | double numberfontSize;
20 | double textfontSize;
21 | String backgroundColor;
22 | String text;
23 |
24 | @override
25 | Widget build(BuildContext context) {
26 | return Consumer(builder: (context, state, child) {
27 | return Container(
28 | height: containerHeight,
29 | width: containerWidth,
30 | decoration: BoxDecoration(
31 | color: HexColor(backgroundColor),
32 | borderRadius: const BorderRadius.all(
33 | Radius.circular(14.0),
34 | ),
35 | ),
36 | child: text.contains('Completed')
37 | ? Column(
38 | mainAxisAlignment: MainAxisAlignment.center,
39 | crossAxisAlignment: CrossAxisAlignment.center,
40 | children: [
41 | Text(
42 | '${state.completedTodos.length}',
43 | style: TextStyle(
44 | color: HexColor('#F9F6E9'),
45 | fontSize: numberfontSize,
46 | fontWeight: FontWeight.w700),
47 | ),
48 | SizedBox(height: 10.h),
49 | Text(
50 | text,
51 | style: TextStyle(
52 | color: HexColor('#F9F6E9'),
53 | fontSize: textfontSize,
54 | fontWeight: FontWeight.w600),
55 | ),
56 | ],
57 | )
58 | : Column(
59 | mainAxisAlignment: MainAxisAlignment.center,
60 | crossAxisAlignment: CrossAxisAlignment.center,
61 | children: [
62 | Text(
63 | '${state.unCompletedTodos.length}',
64 | style: TextStyle(
65 | color: HexColor('#F9F6E9'),
66 | fontSize: numberfontSize,
67 | fontWeight: FontWeight.w700),
68 | ),
69 | SizedBox(height: 10.h),
70 | Text(
71 | text,
72 | style: TextStyle(
73 | color: HexColor('#F9F6E9'),
74 | fontSize: textfontSize,
75 | fontWeight: FontWeight.w600),
76 | ),
77 | ],
78 | ),
79 | );
80 | });
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-App-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-App-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-App-29x29@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-App-29x29@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-App-29x29@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-App-40x40@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "Icon-App-40x40@3x.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-App-60x60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "Icon-App-60x60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "20x20",
59 | "idiom" : "ipad",
60 | "filename" : "Icon-App-20x20@1x.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "20x20",
65 | "idiom" : "ipad",
66 | "filename" : "Icon-App-20x20@2x.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "Icon-App-29x29@1x.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "29x29",
77 | "idiom" : "ipad",
78 | "filename" : "Icon-App-29x29@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "Icon-App-40x40@1x.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "40x40",
89 | "idiom" : "ipad",
90 | "filename" : "Icon-App-40x40@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "Icon-App-76x76@1x.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "76x76",
101 | "idiom" : "ipad",
102 | "filename" : "Icon-App-76x76@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "83.5x83.5",
107 | "idiom" : "ipad",
108 | "filename" : "Icon-App-83.5x83.5@2x.png",
109 | "scale" : "2x"
110 | },
111 | {
112 | "size" : "1024x1024",
113 | "idiom" : "ios-marketing",
114 | "filename" : "Icon-App-1024x1024@1x.png",
115 | "scale" : "1x"
116 | }
117 | ],
118 | "info" : {
119 | "version" : 1,
120 | "author" : "xcode"
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/ios/Runner/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 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/lib/translations/locale_keys.g.dart:
--------------------------------------------------------------------------------
1 | // DO NOT EDIT. This is code generated via package:easy_localization/generate.dart
2 |
3 | abstract class LocaleKeys {
4 | static const homescreen_hello_text = 'homescreen.hello_text';
5 | static const homescreen_subtitle_text = 'homescreen.subtitle_text';
6 | static const homescreen_goodjob_text = 'homescreen.goodjob_text';
7 | static const homescreen_goodjob_subtitle_text = 'homescreen.goodjob_subtitle_text';
8 | static const homescreen_taskstitle = 'homescreen.taskstitle';
9 | static const homescreen_taskssubtitle = 'homescreen.taskssubtitle';
10 | static const homescreen = 'homescreen';
11 | static const dashboard_tasktitle = 'dashboard.tasktitle';
12 | static const dashboard_taskssubtitle = 'dashboard.taskssubtitle';
13 | static const dashboard_alertdialog_title = 'dashboard.alertdialog.title';
14 | static const dashboard_alertdialog_subtitle = 'dashboard.alertdialog.subtitle';
15 | static const dashboard_alertdialog_delete = 'dashboard.alertdialog.delete';
16 | static const dashboard_alertdialog_cancel = 'dashboard.alertdialog.cancel';
17 | static const dashboard_alertdialog = 'dashboard.alertdialog';
18 | static const dashboard_title = 'dashboard.title';
19 | static const dashboard = 'dashboard';
20 | static const profile_completed_text = 'profile.completed_text';
21 | static const profile_uncompleted_text = 'profile.uncompleted_text';
22 | static const profile_alltasks_text = 'profile.alltasks_text';
23 | static const profile_title = 'profile.title';
24 | static const profile_stats = 'profile.stats';
25 | static const profile = 'profile';
26 | static const changename_name_tf = 'changename.name_tf';
27 | static const changename_surname_tf = 'changename.surname_tf';
28 | static const changename_title = 'changename.title';
29 | static const changename_cancel_btn = 'changename.cancel_btn';
30 | static const changename_done_btn = 'changename.done_btn';
31 | static const changename = 'changename';
32 | static const addtodo_title = 'addtodo.title';
33 | static const addtodo_title_tf = 'addtodo.title_tf';
34 | static const addtodo_desc_tf = 'addtodo.desc_tf';
35 | static const addtodo_category_tf = 'addtodo.category_tf';
36 | static const addtodo_date = 'addtodo.date';
37 | static const addtodo_time = 'addtodo.time';
38 | static const addtodo_add_btn = 'addtodo.add_btn';
39 | static const addtodo_cancel_btn = 'addtodo.cancel_btn';
40 | static const addtodo_selected = 'addtodo.selected';
41 | static const addtodo_error_text = 'addtodo.error_text';
42 | static const addtodo = 'addtodo';
43 | static const edittodo_title = 'edittodo.title';
44 | static const edittodo_title_tf = 'edittodo.title_tf';
45 | static const edittodo_category_tf = 'edittodo.category_tf';
46 | static const edittodo_desc_tf = 'edittodo.desc_tf';
47 | static const edittodo_selecteddate = 'edittodo.selecteddate';
48 | static const edittodo_selectedtime = 'edittodo.selectedtime';
49 | static const edittodo_default_date = 'edittodo.default_date';
50 | static const edittodo_default_time = 'edittodo.default_time';
51 | static const edittodo_edit_btn = 'edittodo.edit_btn';
52 | static const edittodo_close_btn = 'edittodo.close_btn';
53 | static const edittodo = 'edittodo';
54 | static const welcomescreen_title = 'welcomescreen.title';
55 | static const welcomescreen_subtitle = 'welcomescreen.subtitle';
56 | static const welcomescreen_done_button = 'welcomescreen.done_button';
57 | static const welcomescreen_name_tf = 'welcomescreen.name_tf';
58 | static const welcomescreen_surname_tf = 'welcomescreen.surname_tf';
59 | static const welcomescreen = 'welcomescreen';
60 |
61 | }
62 |
--------------------------------------------------------------------------------
/lib/Widgets/DetailPage/todo_info_section.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_screenutil/flutter_screenutil.dart';
3 | import 'package:hexcolor/hexcolor.dart';
4 |
5 | import '../../Models/todo.dart';
6 |
7 | class TodoInfoSection extends StatelessWidget {
8 | TodoInfoSection({Key? key, required this.todo}) : super(key: key);
9 | Todo todo;
10 |
11 | @override
12 | Widget build(BuildContext context) {
13 | DateTime todoDate =
14 | DateTime.fromMillisecondsSinceEpoch(todo.dateMilliseconds);
15 | DateTime todoTime =
16 | DateTime.fromMillisecondsSinceEpoch(todo.timeMilliseconds);
17 | return Container(
18 | color: Colors.transparent,
19 | child: Column(
20 | children: [
21 | SizedBox(
22 | height: 20.h,
23 | ),
24 | categoryText(todo.category, context),
25 | SizedBox(
26 | height: 20.h,
27 | ),
28 | Text(
29 | todo.title,
30 | style: TextStyle(
31 | fontWeight: FontWeight.w700,
32 | color: HexColor('#393939'),
33 | fontSize: 24),
34 | ),
35 | Padding(
36 | padding: EdgeInsets.only(left: 20.w, top: 20.h),
37 | child: Row(
38 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
39 | children: [
40 | Row(
41 | children: [
42 | const Icon(
43 | Icons.calendar_today,
44 | ),
45 | Text(
46 | ' ${todoDate.day.toString().padLeft(2, '0')}/${todoDate.month.toString().padLeft(2, '0')}/${todoDate.year}',
47 | style: TextStyle(
48 | fontSize: 15,
49 | color: HexColor('#393939'),
50 | fontWeight: FontWeight.w600,
51 | ),
52 | ),
53 | ],
54 | ),
55 | Padding(
56 | padding: EdgeInsets.only(right: 20.w),
57 | child: Row(
58 | children: [
59 | // Todos time part
60 | const Icon(
61 | Icons.access_time_outlined,
62 | ),
63 | Text(
64 | ' ${todoTime.hour.toString().padLeft(2, '0')}:${todoTime.minute.toString().padLeft(2, '0')}',
65 | style: TextStyle(
66 | fontSize: 15,
67 | color: HexColor('#393939'),
68 | fontWeight: FontWeight.w600,
69 | ),
70 | ),
71 | ],
72 | ),
73 | )
74 | ],
75 | ),
76 | ),
77 | ],
78 | ),
79 | );
80 | }
81 | }
82 |
83 | Widget categoryText(String categoryName, BuildContext context) {
84 | return Container(
85 | height: 25.h,
86 | width: 150.w,
87 | decoration: BoxDecoration(
88 | borderRadius: BorderRadius.circular(40.0),
89 | color: HexColor('#d3e3f2'),
90 | ),
91 | child: Padding(
92 | padding: const EdgeInsets.only(left: 10, right: 10),
93 | child: Center(
94 | child: Text(
95 | categoryName,
96 | style: const TextStyle(
97 | color: Colors.blue, fontWeight: FontWeight.bold, fontSize: 14),
98 | ),
99 | ),
100 | ),
101 | );
102 | }
103 |
--------------------------------------------------------------------------------
/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/Widgets/Dashboard/clear_todos_btn.dart:
--------------------------------------------------------------------------------
1 | import 'package:easy_localization/easy_localization.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:fluttertoast/fluttertoast.dart';
4 | import 'package:hexcolor/hexcolor.dart';
5 | import 'package:provider/provider.dart';
6 | import 'package:todo_app/provider/todos_provider.dart';
7 | import 'package:todo_app/translations/locale_keys.g.dart';
8 |
9 | class ClearTodosBtn extends StatelessWidget {
10 | const ClearTodosBtn({Key? key}) : super(key: key);
11 |
12 | @override
13 | Widget build(BuildContext context) {
14 | return IconButton(
15 | onPressed: () {
16 | if (Provider.of(context, listen: false)
17 | .checkCompletedTodos() ==
18 | true) {
19 | Fluttertoast.showToast(
20 | msg: "You do not have any completed todo.",
21 | toastLength: Toast.LENGTH_SHORT,
22 | gravity: ToastGravity.BOTTOM,
23 | timeInSecForIosWeb: 1,
24 | backgroundColor: Colors.red,
25 | textColor: Colors.white,
26 | fontSize: 16.0);
27 | } else {
28 | showDialog(
29 | context: context,
30 | builder: (BuildContext context) {
31 | return AlertDialog(
32 | backgroundColor: HexColor('#f9f6e8'),
33 | title: Text(LocaleKeys.dashboard_alertdialog_title.tr()),
34 | content: Text(LocaleKeys.dashboard_alertdialog_subtitle.tr()),
35 | actions: [
36 | ElevatedButton(
37 | onPressed: () {
38 | Provider.of(context, listen: false)
39 | .removeCompletedTodos();
40 | Navigator.of(context).pop();
41 | Fluttertoast.showToast(
42 | msg: context.locale == Locale('en')
43 | ? 'Deleted!'
44 | : 'Silindi!',
45 | toastLength: Toast.LENGTH_SHORT,
46 | gravity: ToastGravity.BOTTOM,
47 | timeInSecForIosWeb: 1,
48 | backgroundColor: Colors.greenAccent,
49 | textColor: Colors.white,
50 | fontSize: 16.0);
51 | },
52 | child:
53 | Text(LocaleKeys.dashboard_alertdialog_delete.tr())),
54 | TextButton(
55 | onPressed: () {
56 | Navigator.of(context).pop();
57 | Fluttertoast.showToast(
58 | msg: context.locale == Locale('en')
59 | ? 'Cancelled!'
60 | : 'Vazgeçildi!',
61 | toastLength: Toast.LENGTH_SHORT,
62 | gravity: ToastGravity.BOTTOM,
63 | timeInSecForIosWeb: 1,
64 | backgroundColor: Colors.orange,
65 | textColor: Colors.white,
66 | fontSize: 16.0);
67 | },
68 | child:
69 | Text(LocaleKeys.dashboard_alertdialog_cancel.tr())),
70 | ],
71 | );
72 | });
73 | }
74 | },
75 | icon: const Icon(
76 | Icons.delete,
77 | color: Colors.red,
78 | size: 25,
79 | ),
80 | );
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/lib/Pages/home_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_app_badger/flutter_app_badger.dart';
3 | import 'package:hexcolor/hexcolor.dart';
4 | import 'package:provider/provider.dart';
5 | import 'package:todo_app/Widgets/HomePage/Grettings/greetings.dart';
6 | import 'package:todo_app/Widgets/HomePage/Info/info_widget.dart';
7 | import 'package:todo_app/Widgets/HomePage/Tasks/task_info.dart';
8 | import 'package:todo_app/Widgets/Todo/todo_list.dart';
9 |
10 | import '../provider/todos_provider.dart';
11 |
12 | class HomePage extends StatefulWidget {
13 | const HomePage({Key? key}) : super(key: key);
14 |
15 | @override
16 | _HomePageState createState() => _HomePageState();
17 | }
18 |
19 | class _HomePageState extends State {
20 | late int badgeValue;
21 |
22 | @override
23 | void initState() {
24 | super.initState();
25 | // App icon badge
26 | badgeValue = Provider.of(context, listen: false)
27 | .unCompletedTodos
28 | .where((Todo) {
29 | return DateTime.fromMillisecondsSinceEpoch(Todo.dateMilliseconds).day ==
30 | DateTime.now().day &&
31 | DateTime.fromMillisecondsSinceEpoch(Todo.dateMilliseconds).month ==
32 | DateTime.now().month &&
33 | DateTime.fromMillisecondsSinceEpoch(Todo.dateMilliseconds).year ==
34 | DateTime.now().year;
35 | }).length;
36 | FlutterAppBadger.updateBadgeCount(badgeValue);
37 | }
38 |
39 | @override
40 | Widget build(BuildContext context) {
41 | return Scaffold(
42 | backgroundColor: HexColor('#f9f6e8'),
43 | body: LayoutBuilder(builder: (context, constraints) {
44 | return Column(
45 | children: [
46 | constraints.maxWidth < 350
47 | ? Greetings(customFontSize: 25)
48 | : Greetings(
49 | customFontSize: 30,
50 | ),
51 | constraints.maxWidth < 350
52 | ? InfoWidget(
53 | height: 7.4,
54 | width: 1.1,
55 | customFontSize: 13,
56 | )
57 | // For iphone 11 - height 812 || iphone 13 pro - height 760
58 | : constraints.maxHeight == 812 || constraints.maxHeight == 760
59 | ? InfoWidget(height: 11, width: 1.1, customFontSize: 18)
60 | // For iphone 11 pro, 13 mini, iphone xs - height 728
61 | : constraints.maxHeight == 728
62 | ? InfoWidget(
63 | height: 10.6, width: 1.1, customFontSize: 18)
64 | // For iphone 8,7,iphone se - height 617
65 | : constraints.maxHeight == 617
66 | ? InfoWidget(
67 | height: 8.5, width: 1.1, customFontSize: 18)
68 | // iphone 13 Pro max - 842
69 | : constraints.maxHeight == 842
70 | ? InfoWidget(
71 | height: 11.2,
72 | width: 1.1,
73 | customFontSize: 18)
74 | : constraints.maxHeight == 686
75 | ? InfoWidget(
76 | height: 9.4,
77 | width: 1.1,
78 | customFontSize: 18)
79 | : InfoWidget(
80 | height: 8,
81 | width: 1.1,
82 | customFontSize: 18),
83 | const TaskInfo(),
84 | const Expanded(child: TodoWidget())
85 | ],
86 | );
87 | }),
88 | );
89 | }
90 | }
91 |
--------------------------------------------------------------------------------
/lib/Pages/calendar_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:hexcolor/hexcolor.dart';
3 | import 'package:provider/provider.dart';
4 | import 'package:table_calendar/table_calendar.dart';
5 | import 'package:todo_app/Widgets/Todo/todo_card.dart';
6 | import 'package:todo_app/provider/todos_provider.dart';
7 |
8 | class CalendarPage extends StatefulWidget {
9 | const CalendarPage({Key? key}) : super(key: key);
10 |
11 | @override
12 | _CalendarPageState createState() => _CalendarPageState();
13 | }
14 |
15 | class _CalendarPageState extends State {
16 | DateTime _focusedDay = DateTime.now();
17 | DateTime? _selectedDay;
18 |
19 | @override
20 | void initState() {
21 | super.initState();
22 | _selectedDay = _focusedDay;
23 | }
24 |
25 | @override
26 | Widget build(BuildContext context) {
27 | return Scaffold(
28 | backgroundColor: HexColor('#f9f6e8'),
29 | body: Padding(
30 | padding: const EdgeInsets.only(top: 30.0),
31 | child: Column(
32 | children: [
33 | TableCalendar(
34 | rowHeight: 45,
35 | firstDay: DateTime.utc(2010),
36 | lastDay: DateTime.utc(2050),
37 | eventLoader:
38 | Provider.of(context, listen: false).getTodos,
39 | focusedDay: _focusedDay,
40 | selectedDayPredicate: (day) => isSameDay(_selectedDay, day),
41 | calendarFormat: CalendarFormat.month,
42 | calendarStyle: const CalendarStyle(
43 | todayDecoration: BoxDecoration(
44 | color: Colors.amber, shape: BoxShape.circle)),
45 | onDaySelected: (selectedDay, focusedDay) {
46 | setState(() {
47 | _selectedDay = selectedDay;
48 | _focusedDay = focusedDay; // update `_focusedDay` here as well
49 | });
50 | },
51 | ),
52 | Expanded(
53 | child: Consumer(builder: (context, state, child) {
54 | return ListView.builder(
55 | // ignore: non_constant_identifier_names
56 | itemCount: state.unCompletedTodos.where((Todo) {
57 | return DateTime.fromMillisecondsSinceEpoch(
58 | Todo.dateMilliseconds)
59 | .day ==
60 | _selectedDay?.day &&
61 | DateTime.fromMillisecondsSinceEpoch(
62 | Todo.dateMilliseconds)
63 | .month ==
64 | _selectedDay?.month &&
65 | DateTime.fromMillisecondsSinceEpoch(
66 | Todo.dateMilliseconds)
67 | .year ==
68 | _selectedDay?.year;
69 | }).length,
70 | itemBuilder: (context, index) => TodoCard(
71 | // ignore: non_constant_identifier_names
72 | todo: state.unCompletedTodos.where((Todo) {
73 | var todoTime = DateTime.fromMillisecondsSinceEpoch(
74 | Todo.dateMilliseconds);
75 | return todoTime.day == _selectedDay?.day &&
76 | DateTime.fromMillisecondsSinceEpoch(
77 | Todo.dateMilliseconds)
78 | .month ==
79 | _selectedDay?.month &&
80 | DateTime.fromMillisecondsSinceEpoch(
81 | Todo.dateMilliseconds)
82 | .year ==
83 | _selectedDay?.year;
84 | }).toList()[index]),
85 | );
86 | }),
87 | ),
88 | ],
89 | ),
90 | ),
91 | );
92 | }
93 | }
94 |
--------------------------------------------------------------------------------
/lib/Pages/welcome_screen.dart:
--------------------------------------------------------------------------------
1 | import 'package:easy_localization/easy_localization.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:provider/provider.dart';
4 | import 'package:todo_app/Widgets/Welcome/welcome_text.dart';
5 | import 'package:todo_app/Widgets/Welcome/welcome_tf.dart';
6 | import 'package:todo_app/provider/todos_provider.dart';
7 | import 'package:todo_app/translations/locale_keys.g.dart';
8 |
9 | import 'main_screen.dart';
10 |
11 | class WelcomeScreen extends StatefulWidget {
12 | const WelcomeScreen({Key? key}) : super(key: key);
13 |
14 | @override
15 | _WelcomeScreenState createState() => _WelcomeScreenState();
16 | }
17 |
18 | class _WelcomeScreenState extends State {
19 | // ignore: prefer_typing_uninitialized_variables
20 | late var userName;
21 |
22 | @override
23 | void initState() {
24 | super.initState();
25 | Provider.of(context, listen: false).initSharedPreferences();
26 | userName = TodosProvider().readName('userName');
27 | }
28 |
29 | @override
30 | Widget build(BuildContext context) {
31 | var nameController = TextEditingController();
32 | var surnameController = TextEditingController();
33 | var formKey = GlobalKey();
34 | return Scaffold(
35 | body: Padding(
36 | padding: const EdgeInsets.only(top: 20.0),
37 | child: SingleChildScrollView(
38 | reverse: true,
39 | child: Column(
40 | children: [
41 | const welcomeText(),
42 | Form(
43 | key: formKey,
44 | child: Padding(
45 | padding: const EdgeInsets.only(
46 | left: 15.0, right: 15, bottom: 10),
47 | child: Column(children: [
48 | WelcomCustomTF(
49 | controller: nameController,
50 | labelText: LocaleKeys.welcomescreen_name_tf.tr()),
51 | WelcomCustomTF(
52 | controller: surnameController,
53 | labelText: LocaleKeys.welcomescreen_surname_tf.tr()),
54 | ]),
55 | ),
56 | ),
57 | Consumer(
58 | builder: (context, state, child) => Padding(
59 | padding: const EdgeInsets.only(top: 20.0),
60 | child: SizedBox(
61 | height: MediaQuery.of(context).size.height / 13,
62 | width: MediaQuery.of(context).size.width / 1.2,
63 | child: ElevatedButton(
64 | style: ButtonStyle(
65 | backgroundColor: MaterialStateProperty.all(
66 | Colors.amber.shade600),
67 | shape: MaterialStateProperty.all<
68 | RoundedRectangleBorder>(RoundedRectangleBorder(
69 | borderRadius: BorderRadius.circular(13.0),
70 | )),
71 | ),
72 | onPressed: () {
73 | bool validResult = formKey.currentState!.validate();
74 | if (validResult == true) {
75 | state.setName(nameController.text);
76 | state.setsurName(surnameController.text);
77 | Navigator.pushReplacement(
78 | context,
79 | MaterialPageRoute(
80 | builder: (context) =>
81 | const MainScreen()));
82 | }
83 | },
84 | child:
85 | Text(LocaleKeys.welcomescreen_done_button.tr())),
86 | ),
87 | ),
88 | )
89 | ],
90 | )),
91 | ),
92 | );
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/lib/Widgets/HomePage/Info/info_widget.dart:
--------------------------------------------------------------------------------
1 | import 'package:auto_size_text/auto_size_text.dart';
2 | import 'package:easy_localization/easy_localization.dart';
3 | import 'package:flutter/material.dart';
4 | // External Libs
5 | import 'package:hexcolor/hexcolor.dart';
6 | import 'package:percent_indicator/percent_indicator.dart';
7 | import 'package:provider/provider.dart';
8 | import 'package:todo_app/provider/todos_provider.dart';
9 | import 'package:todo_app/translations/locale_keys.g.dart';
10 |
11 | class InfoWidget extends StatelessWidget {
12 | InfoWidget(
13 | {Key? key,
14 | required this.height,
15 | required this.width,
16 | required this.customFontSize})
17 | : super(key: key);
18 | double width;
19 | double height;
20 | double customFontSize;
21 |
22 | Widget _circularProgressBar(double percent) {
23 | return CircularPercentIndicator(
24 | radius: 48.0,
25 | lineWidth: 6.0,
26 | animation: true,
27 | percent: percent.isNaN ? 0 : percent,
28 | center: Text(
29 | percent.isNaN
30 | ? '${((percent = 0) * 100).round()}%'
31 | : '${(percent * 100).round()}%',
32 | style: const TextStyle(color: Colors.white, fontSize: 10),
33 | ),
34 | backgroundColor: Colors.white,
35 | progressColor: Colors.orangeAccent,
36 | );
37 | }
38 |
39 | @override
40 | Widget build(BuildContext context) {
41 | double percent =
42 | Provider.of(context).calcTodoPercent(DateTime.now());
43 | //print(percent);
44 | return Row(
45 | mainAxisAlignment: MainAxisAlignment.center,
46 | children: [
47 | Stack(
48 | alignment: Alignment.bottomRight,
49 | children: [
50 | Container(
51 | width: MediaQuery.of(context).size.width / width,
52 | height: MediaQuery.of(context).size.height / height,
53 | decoration: BoxDecoration(
54 | color: HexColor('#ff9d73'),
55 | borderRadius: BorderRadius.circular(20)),
56 | child: Padding(
57 | padding: const EdgeInsets.only(top: 14, bottom: 12, left: 24),
58 | child: Row(
59 | children: [
60 | Column(children: [
61 | _circularProgressBar(percent),
62 | ]),
63 | Padding(
64 | padding: const EdgeInsets.only(left: 14.0),
65 | child: Column(
66 | crossAxisAlignment: CrossAxisAlignment.start,
67 | children: [
68 | Consumer(
69 | builder: (context, state, child) {
70 | return AutoSizeText(
71 | LocaleKeys.homescreen_goodjob_text
72 | .tr(args: [(state.name)]),
73 | maxLines: 2,
74 | style: TextStyle(
75 | color: Colors.white,
76 | fontSize: customFontSize,
77 | fontWeight: FontWeight.bold),
78 | );
79 | }),
80 | Padding(
81 | padding: const EdgeInsets.symmetric(vertical: 6),
82 | child: Text(
83 | LocaleKeys.homescreen_goodjob_subtitle_text.tr(),
84 | style: const TextStyle(
85 | color: Colors.white,
86 | fontSize: 14,
87 | ),
88 | ),
89 | )
90 | ],
91 | ),
92 | ),
93 | ],
94 | ),
95 | ),
96 | )
97 | ],
98 | ),
99 | ],
100 | );
101 | }
102 | }
103 |
--------------------------------------------------------------------------------
/lib/Pages/detail_screen.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_screenutil/flutter_screenutil.dart';
3 | import 'package:flutter_svg/flutter_svg.dart';
4 | import 'package:hexcolor/hexcolor.dart';
5 | import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
6 | import 'package:todo_app/Models/todo.dart';
7 | import 'package:todo_app/Widgets/DetailPage/todo_description.dart';
8 |
9 | import '../Widgets/DetailPage/todo_info_section.dart';
10 | import 'edit_todo.dart';
11 |
12 | class DetailScreen extends StatelessWidget {
13 | const DetailScreen({Key? key, required this.todo}) : super(key: key);
14 | final Todo todo;
15 |
16 | @override
17 | Widget build(BuildContext context) {
18 | return ScreenUtilInit(
19 | builder: () => LayoutBuilder(
20 | builder: (context, constraints) {
21 | return Scaffold(
22 | floatingActionButton: FloatingActionButton(
23 | onPressed: () {
24 | showCupertinoModalBottomSheet(
25 | shape: RoundedRectangleBorder(
26 | borderRadius: BorderRadius.circular(10.0),
27 | ),
28 | context: context,
29 | builder: (context) => SizedBox(
30 | height:
31 | // for iphone 11
32 | constraints.maxHeight == 896 ||
33 | constraints.maxHeight == 926
34 | ? MediaQuery.of(context).size.height / 1.6
35 | :
36 | // For iphone 11 pro, 12 mini, 12 pro(height 771)
37 | constraints.maxHeight == 812 ||
38 | constraints.maxHeight == 771
39 | ? MediaQuery.of(context).size.height / 1.5
40 | : //For iphone 5s
41 | constraints.maxHeight == 522
42 | ? MediaQuery.of(context).size.height / 1
43 | : MediaQuery.of(context).size.height / 1.2,
44 | child: EditTodo(
45 | todo: todo,
46 | ),
47 | ),
48 | );
49 | },
50 | child: SvgPicture.asset(
51 | 'lib/img/editicon.svg',
52 | width: 26.w,
53 | ),
54 | backgroundColor: Colors.orangeAccent,
55 | ),
56 | backgroundColor: HexColor('#F9F6E9'),
57 | body: Column(
58 | children: [
59 | Expanded(
60 | flex: 2,
61 | child: TodoInfoSection(
62 | todo: todo,
63 | ),
64 | ),
65 | Expanded(
66 | flex: constraints.maxHeight == 621
67 | ? 6
68 | : constraints.maxHeight == 522
69 | ? 5
70 | : 7,
71 | child: Container(
72 | decoration: const BoxDecoration(
73 | color: Colors.white,
74 | borderRadius: BorderRadius.only(
75 | topLeft: Radius.circular(30),
76 | topRight: Radius.circular(30),
77 | ),
78 | ),
79 | child: TodoDescription(
80 | todo: todo,
81 | textFontSize:
82 | // for iphone 7 - Height 621
83 | constraints.maxHeight == 621
84 | ? 18.h
85 | :
86 | // for iphone 5S - Height 522
87 | constraints.maxHeight == 522
88 | ? 16.h
89 | : 14.h,
90 | ),
91 | ),
92 | ),
93 | ],
94 | ),
95 | );
96 | },
97 | ),
98 | );
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/web/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | todo_app
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
44 |
108 |
109 |
--------------------------------------------------------------------------------
/lib/translations/codegen_loader.g.dart:
--------------------------------------------------------------------------------
1 | // DO NOT EDIT. This is code generated via package:easy_localization/generate.dart
2 |
3 | // ignore_for_file: prefer_single_quotes
4 |
5 | import 'dart:ui';
6 |
7 | import 'package:easy_localization/easy_localization.dart' show AssetLoader;
8 |
9 | class CodegenLoader extends AssetLoader{
10 | const CodegenLoader();
11 |
12 | @override
13 | Future