├── .gitignore ├── .metadata ├── .vscode └── launch.json ├── README.md ├── analysis_options.yaml ├── android ├── .gitignore ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── codeforany │ │ │ │ └── trackizer │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable-v21 │ │ │ └── launch_background.xml │ │ │ ├── drawable │ │ │ └── launch_background.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── values-night │ │ │ └── styles.xml │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets ├── font │ ├── Inter-Bold.ttf │ ├── Inter-Medium.ttf │ ├── Inter-Regular.ttf │ └── Inter-SemiBold.ttf └── img │ ├── Trash.png │ ├── add.png │ ├── app_icon.png │ ├── app_logo.png │ ├── apple.png │ ├── apple_btn.png │ ├── auto_&_transport.png │ ├── back.png │ ├── bottom_bar_bg.png │ ├── budgets.png │ ├── calendar.png │ ├── card_blank.png │ ├── center_btn.png │ ├── chart.png │ ├── creditcards.png │ ├── dorp_down.png │ ├── entertainment.png │ ├── face_id.png │ ├── fb.png │ ├── fb_btn.png │ ├── fnbtn.png │ ├── font.png │ ├── google.png │ ├── google_btn.png │ ├── hbo_logo.png │ ├── home.png │ ├── home_bg.png │ ├── icloud.png │ ├── light_theme.png │ ├── mastercard_logo.png │ ├── minus.png │ ├── money.png │ ├── netflix_logo.png │ ├── next.png │ ├── onedrive_logo.png │ ├── plus.png │ ├── primary_btn.png │ ├── secodry_btn.png │ ├── security.png │ ├── settings.png │ ├── sorting.png │ ├── spotify_logo.png │ ├── u1.png │ ├── welcome_screen.png │ └── youtube_logo.png ├── dev_lib ├── calendar_agenda │ ├── .gitignore │ ├── .metadata │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── assets │ │ ├── CalendarAppbarFalse.png │ │ ├── FullCalendarScrollHorizontal.png │ │ ├── FullCalendarScrollVertical.png │ │ ├── demo.gif │ │ ├── selectedDayCenter.png │ │ ├── selectedDayLeft.png │ │ └── selectedDayRight.png │ ├── lib │ │ ├── calendar_agenda.dart │ │ └── src │ │ │ ├── calendar.dart │ │ │ ├── controller.dart │ │ │ ├── fullcalendar.dart │ │ │ └── typedata.dart │ ├── pubspec.lock │ ├── pubspec.yaml │ └── test │ │ └── calendar_agenda_test.dart └── card_swiper │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── analysis_options.yaml │ ├── banner.jpg │ ├── dev │ └── bots │ │ ├── travis_install.sh │ │ └── travis_script.sh │ ├── lib │ ├── card_swiper.dart │ └── src │ │ ├── custom_layout.dart │ │ ├── flutter_page_indicator │ │ └── flutter_page_indicator.dart │ │ ├── swiper.dart │ │ ├── swiper_control.dart │ │ ├── swiper_controller.dart │ │ ├── swiper_pagination.dart │ │ ├── swiper_plugin.dart │ │ └── transformer_page_view │ │ ├── index_controller.dart │ │ ├── parallax.dart │ │ └── transformer_page_view.dart │ ├── pubspec.lock │ ├── pubspec.yaml │ └── test │ ├── control_test.dart │ ├── flutter_swiper_test.dart │ ├── layout_test.dart │ └── pagination_test.dart ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings ├── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ └── Icon-App-83.5x83.5@2x.png │ │ └── LaunchImage.imageset │ │ │ ├── Contents.json │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ └── README.md │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── Info.plist │ └── Runner-Bridging-Header.h └── RunnerTests │ └── RunnerTests.swift ├── lib ├── common │ └── color_extension.dart ├── common_widget │ ├── budgets_row.dart │ ├── custom_arc_180_painter.dart │ ├── custom_arc_painter.dart │ ├── icon_item_row.dart │ ├── image_button.dart │ ├── item_row.dart │ ├── primary_button.dart │ ├── round_textfield.dart │ ├── secondary_boutton.dart │ ├── segment_button.dart │ ├── status_button.dart │ ├── subscription_cell.dart │ ├── subscription_home_row.dart │ └── upcoming_bill_row.dart ├── main.dart └── view │ ├── add_subscription │ └── add_subscription_view.dart │ ├── calender │ └── calender_view.dart │ ├── card │ └── cards_view.dart │ ├── home │ └── home_view.dart │ ├── login │ ├── sign_in_view.dart │ ├── sign_up_view.dart │ ├── social_login.dart │ └── welcome_view.dart │ ├── main_tab │ └── main_tab_view.dart │ ├── settings │ └── settings_view.dart │ ├── spending_budgets │ └── spending_budgets_view.dart │ └── subscription_info │ └── subscription_info_view.dart ├── pubspec.lock └── pubspec.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | migrate_working_dir/ 12 | 13 | # IntelliJ related 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | 19 | # The .vscode folder contains launch configuration and tasks you configure in 20 | # VS Code which you may wish to be included in version control, so this line 21 | # is commented out by default. 22 | #.vscode/ 23 | 24 | # Flutter/Dart/Pub related 25 | **/doc/api/ 26 | **/ios/Flutter/.last_build_id 27 | .dart_tool/ 28 | .flutter-plugins 29 | .flutter-plugins-dependencies 30 | .packages 31 | .pub-cache/ 32 | .pub/ 33 | /build/ 34 | 35 | # Symbolication related 36 | app.*.symbols 37 | 38 | # Obfuscation related 39 | app.*.map.json 40 | 41 | # Android Studio will place build artifacts here 42 | /android/app/debug 43 | /android/app/profile 44 | /android/app/release 45 | -------------------------------------------------------------------------------- /.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. 5 | 6 | version: 7 | revision: 796c8ef79279f9c774545b3771238c3098dbefab 8 | channel: stable 9 | 10 | project_type: app 11 | 12 | # Tracks metadata for the flutter migrate command 13 | migration: 14 | platforms: 15 | - platform: root 16 | create_revision: 796c8ef79279f9c774545b3771238c3098dbefab 17 | base_revision: 796c8ef79279f9c774545b3771238c3098dbefab 18 | - platform: android 19 | create_revision: 796c8ef79279f9c774545b3771238c3098dbefab 20 | base_revision: 796c8ef79279f9c774545b3771238c3098dbefab 21 | - platform: ios 22 | create_revision: 796c8ef79279f9c774545b3771238c3098dbefab 23 | base_revision: 796c8ef79279f9c774545b3771238c3098dbefab 24 | - platform: linux 25 | create_revision: 796c8ef79279f9c774545b3771238c3098dbefab 26 | base_revision: 796c8ef79279f9c774545b3771238c3098dbefab 27 | - platform: macos 28 | create_revision: 796c8ef79279f9c774545b3771238c3098dbefab 29 | base_revision: 796c8ef79279f9c774545b3771238c3098dbefab 30 | - platform: web 31 | create_revision: 796c8ef79279f9c774545b3771238c3098dbefab 32 | base_revision: 796c8ef79279f9c774545b3771238c3098dbefab 33 | - platform: windows 34 | create_revision: 796c8ef79279f9c774545b3771238c3098dbefab 35 | base_revision: 796c8ef79279f9c774545b3771238c3098dbefab 36 | 37 | # User provided section 38 | 39 | # List of Local paths (relative to this file) that should be 40 | # ignored by the migrate tool. 41 | # 42 | # Files that are not part of the templates will be ignored by default. 43 | unmanaged_files: 44 | - 'lib/main.dart' 45 | - 'ios/Runner.xcodeproj/project.pbxproj' 46 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "trackizer", 9 | "request": "launch", 10 | "type": "dart" 11 | }, 12 | { 13 | "name": "trackizer (profile mode)", 14 | "request": "launch", 15 | "type": "dart", 16 | "flutterMode": "profile" 17 | }, 18 | { 19 | "name": "trackizer (release mode)", 20 | "request": "launch", 21 | "type": "dart", 22 | "flutterMode": "release" 23 | }, 24 | { 25 | "name": "calendar_agenda", 26 | "cwd": "dev_lib/calendar_agenda", 27 | "request": "launch", 28 | "type": "dart" 29 | }, 30 | { 31 | "name": "calendar_agenda (profile mode)", 32 | "cwd": "dev_lib/calendar_agenda", 33 | "request": "launch", 34 | "type": "dart", 35 | "flutterMode": "profile" 36 | }, 37 | { 38 | "name": "calendar_agenda (release mode)", 39 | "cwd": "dev_lib/calendar_agenda", 40 | "request": "launch", 41 | "type": "dart", 42 | "flutterMode": "release" 43 | }, 44 | { 45 | "name": "card_swiper", 46 | "cwd": "dev_lib/card_swiper", 47 | "request": "launch", 48 | "type": "dart" 49 | }, 50 | { 51 | "name": "card_swiper (profile mode)", 52 | "cwd": "dev_lib/card_swiper", 53 | "request": "launch", 54 | "type": "dart", 55 | "flutterMode": "profile" 56 | }, 57 | { 58 | "name": "card_swiper (release mode)", 59 | "cwd": "dev_lib/card_swiper", 60 | "request": "launch", 61 | "type": "dart", 62 | "flutterMode": "release" 63 | } 64 | ] 65 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Monthly Expenses Trackizer App UI UX Design Convent Into Flutter Code 2 | 3 | # codeforany @codeforany 4 | 5 | - [Youtube Full Playlist: Monthly Expenses App UI UX Design Convent Into Flutter Code](https://www.youtube.com/playlist?list=PLzcRC7PA0xWQRSF-Crjk6q3AQArDgCxak) 6 | - [Youtube Channel: @codeforany](https://www.youtube.com/channel/UCdQTp9wRK5vAOlEQZf9PHSg) 7 | - [Youtube Channel Subscribe: @codeforany](https://www.youtube.com/channel/UCdQTp9wRK5vAOlEQZf9PHSg?sub_confirmation=1) 8 | 9 | - [Youtube Video Part-1: App Induction, Sign Up Flow UI](https://youtu.be/A8Ou5iHU5lI) 10 | - [Youtube Video Part-2: Bottom TabView UI, Home Tab UI](https://youtu.be/LwW4Z35n-wM) 11 | - [Youtube Video Part-3: Spending Budgets Tab UI](https://youtu.be/LHkkCG8W5YI) 12 | - [Youtube Video Part-4: Subscription Schedule Calendar Tab UI](https://youtu.be/aViCUzVWo7o) 13 | - [Youtube Video Part-5: Add New Subscription UI](https://youtu.be/zNd3YDQu3sw) 14 | - [Youtube Video Part-6: Subscription Info Details Screen UI](https://youtu.be/5-sb4jXf3bc) 15 | - [Youtube Video Part-7: App Settings Screen UI](https://youtu.be/l9dM3X0Up0A) 16 | - [Youtube Video Part-8: Add Credit Cards Tab UI](https://youtu.be/zlLowXpiAZw) 17 | 18 | UI UX App Design by: [symu.co](https://symu.co/) 19 | 20 | A new Flutter project. 21 | 22 | ## Getting Started 23 | 24 | This project is a starting point for a Flutter application. 25 | 26 | A few resources to get you started if this is your first Flutter project: 27 | 28 | - [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) 29 | - [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) 30 | 31 | For help getting started with Flutter development, view the 32 | [online documentation](https://docs.flutter.dev/), which offers tutorials, 33 | samples, guidance on mobile development, and a full API reference. 34 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | namespace "com.codeforany.trackizer" 30 | compileSdkVersion flutter.compileSdkVersion 31 | ndkVersion flutter.ndkVersion 32 | 33 | compileOptions { 34 | sourceCompatibility JavaVersion.VERSION_1_8 35 | targetCompatibility JavaVersion.VERSION_1_8 36 | } 37 | 38 | kotlinOptions { 39 | jvmTarget = '1.8' 40 | } 41 | 42 | sourceSets { 43 | main.java.srcDirs += 'src/main/kotlin' 44 | } 45 | 46 | defaultConfig { 47 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 48 | applicationId "com.codeforany.trackizer" 49 | // You can update the following values to match your application needs. 50 | // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. 51 | minSdkVersion flutter.minSdkVersion 52 | targetSdkVersion flutter.targetSdkVersion 53 | versionCode flutterVersionCode.toInteger() 54 | versionName flutterVersionName 55 | } 56 | 57 | buildTypes { 58 | release { 59 | // TODO: Add your own signing config for the release build. 60 | // Signing with the debug keys for now, so `flutter run --release` works. 61 | signingConfig signingConfigs.debug 62 | } 63 | } 64 | } 65 | 66 | flutter { 67 | source '../..' 68 | } 69 | 70 | dependencies { 71 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 72 | } 73 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 14 | 18 | 22 | 23 | 24 | 25 | 26 | 27 | 29 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/codeforany/trackizer/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.codeforany.trackizer 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.7.10' 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:7.3.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 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | tasks.register("clean", Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip 6 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /assets/font/Inter-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/font/Inter-Bold.ttf -------------------------------------------------------------------------------- /assets/font/Inter-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/font/Inter-Medium.ttf -------------------------------------------------------------------------------- /assets/font/Inter-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/font/Inter-Regular.ttf -------------------------------------------------------------------------------- /assets/font/Inter-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/font/Inter-SemiBold.ttf -------------------------------------------------------------------------------- /assets/img/Trash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/Trash.png -------------------------------------------------------------------------------- /assets/img/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/add.png -------------------------------------------------------------------------------- /assets/img/app_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/app_icon.png -------------------------------------------------------------------------------- /assets/img/app_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/app_logo.png -------------------------------------------------------------------------------- /assets/img/apple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/apple.png -------------------------------------------------------------------------------- /assets/img/apple_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/apple_btn.png -------------------------------------------------------------------------------- /assets/img/auto_&_transport.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/auto_&_transport.png -------------------------------------------------------------------------------- /assets/img/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/back.png -------------------------------------------------------------------------------- /assets/img/bottom_bar_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/bottom_bar_bg.png -------------------------------------------------------------------------------- /assets/img/budgets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/budgets.png -------------------------------------------------------------------------------- /assets/img/calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/calendar.png -------------------------------------------------------------------------------- /assets/img/card_blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/card_blank.png -------------------------------------------------------------------------------- /assets/img/center_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/center_btn.png -------------------------------------------------------------------------------- /assets/img/chart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/chart.png -------------------------------------------------------------------------------- /assets/img/creditcards.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/creditcards.png -------------------------------------------------------------------------------- /assets/img/dorp_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/dorp_down.png -------------------------------------------------------------------------------- /assets/img/entertainment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/entertainment.png -------------------------------------------------------------------------------- /assets/img/face_id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/face_id.png -------------------------------------------------------------------------------- /assets/img/fb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/fb.png -------------------------------------------------------------------------------- /assets/img/fb_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/fb_btn.png -------------------------------------------------------------------------------- /assets/img/fnbtn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/fnbtn.png -------------------------------------------------------------------------------- /assets/img/font.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/font.png -------------------------------------------------------------------------------- /assets/img/google.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/google.png -------------------------------------------------------------------------------- /assets/img/google_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/google_btn.png -------------------------------------------------------------------------------- /assets/img/hbo_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/hbo_logo.png -------------------------------------------------------------------------------- /assets/img/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/home.png -------------------------------------------------------------------------------- /assets/img/home_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/home_bg.png -------------------------------------------------------------------------------- /assets/img/icloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/icloud.png -------------------------------------------------------------------------------- /assets/img/light_theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/light_theme.png -------------------------------------------------------------------------------- /assets/img/mastercard_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/mastercard_logo.png -------------------------------------------------------------------------------- /assets/img/minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/minus.png -------------------------------------------------------------------------------- /assets/img/money.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/money.png -------------------------------------------------------------------------------- /assets/img/netflix_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/netflix_logo.png -------------------------------------------------------------------------------- /assets/img/next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/next.png -------------------------------------------------------------------------------- /assets/img/onedrive_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/onedrive_logo.png -------------------------------------------------------------------------------- /assets/img/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/plus.png -------------------------------------------------------------------------------- /assets/img/primary_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/primary_btn.png -------------------------------------------------------------------------------- /assets/img/secodry_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/secodry_btn.png -------------------------------------------------------------------------------- /assets/img/security.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/security.png -------------------------------------------------------------------------------- /assets/img/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/settings.png -------------------------------------------------------------------------------- /assets/img/sorting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/sorting.png -------------------------------------------------------------------------------- /assets/img/spotify_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/spotify_logo.png -------------------------------------------------------------------------------- /assets/img/u1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/u1.png -------------------------------------------------------------------------------- /assets/img/welcome_screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/welcome_screen.png -------------------------------------------------------------------------------- /assets/img/youtube_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/assets/img/youtube_logo.png -------------------------------------------------------------------------------- /dev_lib/calendar_agenda/.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | .dart_tool/ 26 | .flutter-plugins 27 | .flutter-plugins-dependencies 28 | .packages 29 | .pub-cache/ 30 | .pub/ 31 | build/ 32 | 33 | # Android related 34 | **/android/**/gradle-wrapper.jar 35 | **/android/.gradle 36 | **/android/captures/ 37 | **/android/gradlew 38 | **/android/gradlew.bat 39 | **/android/local.properties 40 | **/android/**/GeneratedPluginRegistrant.java 41 | 42 | # iOS/XCode related 43 | **/ios/**/*.mode1v3 44 | **/ios/**/*.mode2v3 45 | **/ios/**/*.moved-aside 46 | **/ios/**/*.pbxuser 47 | **/ios/**/*.perspectivev3 48 | **/ios/**/*sync/ 49 | **/ios/**/.sconsign.dblite 50 | **/ios/**/.tags* 51 | **/ios/**/.vagrant/ 52 | **/ios/**/DerivedData/ 53 | **/ios/**/Icon? 54 | **/ios/**/Pods/ 55 | **/ios/**/.symlinks/ 56 | **/ios/**/profile 57 | **/ios/**/xcuserdata 58 | **/ios/.generated/ 59 | **/ios/Flutter/App.framework 60 | **/ios/Flutter/Flutter.framework 61 | **/ios/Flutter/Flutter.podspec 62 | **/ios/Flutter/Generated.xcconfig 63 | **/ios/Flutter/ephemeral 64 | **/ios/Flutter/app.flx 65 | **/ios/Flutter/app.zip 66 | **/ios/Flutter/flutter_assets/ 67 | **/ios/Flutter/flutter_export_environment.sh 68 | **/ios/ServiceDefinitions.json 69 | **/ios/Runner/GeneratedPluginRegistrant.* 70 | 71 | # Exceptions to above rules. 72 | !**/ios/**/default.mode1v3 73 | !**/ios/**/default.mode2v3 74 | !**/ios/**/default.pbxuser 75 | !**/ios/**/default.perspectivev3 76 | -------------------------------------------------------------------------------- /dev_lib/calendar_agenda/.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: f4abaa0735eba4dfd8f33f73363911d63931fe03 8 | channel: stable 9 | 10 | project_type: package 11 | -------------------------------------------------------------------------------- /dev_lib/calendar_agenda/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [0.0.2+3] - 2021-24-09 2 | 3 | * add center parameter to SelectedDayPosition 4 | * Update README.md 5 | 6 | ## [0.0.2+2] - 2021-22-09 7 | 8 | * Add go to selected date in full calendar mode 9 | * fixing bug in full calendar layout 10 | * update the example of a package 11 | 12 | ## [0.0.2+1] - 2021-22-09 13 | 14 | * fixing bug show/hide fullCalendar 15 | * fixing day list width 16 | 17 | ## [0.0.2] - 2021-13-09 18 | 19 | * Fixing alignment bug 20 | 21 | ## [0.0.1] - 2021-01-09 22 | 23 | * Add color customization 24 | * Add events date list 25 | * Add two layout full calendar mode 26 | * Add background image to selected day 27 | * Add background image to full calendar view 28 | * Add option selected day in left or right 29 | * and another cool stuff 30 | -------------------------------------------------------------------------------- /dev_lib/calendar_agenda/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) [2021] [Razinal Rahmat] 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /dev_lib/calendar_agenda/README.md: -------------------------------------------------------------------------------- 1 | **Calendar agenda widget with a lot of customizable styles.** 2 | 3 |

4 | Pub Package 5 | License: MIT 6 |

7 | 8 | # Getting Started 9 | 10 | 1. Depend on it 11 | Add it to your package's pubspec.yaml file 12 | ```yaml 13 | dependencies: 14 | flutter: 15 | sdk: flutter 16 | calendar_agenda: version 17 | ``` 18 | 2. Install it 19 | Install packages from the command line 20 | ```sh 21 | flutter pub get 22 | ``` 23 | 3. Import it 24 | Import it to your project 25 | ```dart 26 | import 'package:calendar_agenda/calendar_agenda.dart'; 27 | ``` 28 | 29 | SelectedDayPosition.center | SelectedDayPosition.Left | SelectedDayPosition.Right 30 | :-------------------------:|:-------------------------:|:-------------------------: 31 | ![](https://github.com/sud0su/calendar_agenda/blob/main/assets/selectedDayCenter.png?raw=true) | ![](https://github.com/sud0su/calendar_agenda/blob/main/assets/selectedDayLeft.png?raw=true) | ![](https://github.com/sud0su/calendar_agenda/blob/main/assets/selectedDayRight.png?raw=true) 32 | 33 | FullCalendarScroll.vertical | FullCalendarScroll.horizontal 34 | :-------------------------:|:-------------------------: 35 | ![](https://github.com/sud0su/calendar_agenda/blob/main/assets/FullCalendarScrollVertical.png?raw=true) | ![](https://github.com/sud0su/calendar_agenda/blob/main/assets/FullCalendarScrollHorizontal.png?raw=true) 36 | 37 | 38 | ### Demo 39 | 40 | ![](https://github.com/sud0su/calendar_agenda/blob/main/assets/demo.gif?raw=true) 41 | 42 | # How to use? 43 | 44 | Use the **CalendarAgenda** Widget 45 | ```dart 46 | CalendarAgenda( 47 | initialDate: DateTime.now(), 48 | firstDate: DateTime.now().subtract(Duration(days: 140)), 49 | lastDate: DateTime.now().add(Duration(days: 4)), 50 | onDateSelected: (date) { 51 | print(date); 52 | }, 53 | ) 54 | ``` 55 | 56 | # Props 57 | 58 | | Props | Types | Required | defaultValues | 59 | | ------------ | ------------ | ------------ | ------------ | 60 | | initialDate | DateTime | True | | 61 | | firstDate | DateTime | True | | 62 | | lastDate | DateTime | True | | 63 | | onDateSelected | Funtion | False | | 64 | | backgroundColor | Color? | False | | 65 | | selectedDayLogo | ImageProvider\? | False | | 66 | | controller | CalendarAgendaController? | False | | 67 | | selectedDateColor | Color? | False | Colors.black | 68 | | dateColor | Color? | False | Colors.white | 69 | | calendarBackground | Color? | False |Colors.white | 70 | | calendarEventSelectedColor | Color? | False | Colors.white | 71 | | calendarEventColor | Color? | False | Colors.blue | 72 | | locale | String? | False | 'en' | 73 | | leading | Widget? | False | | 74 | | appbar | bool | False | False | 75 | | events | List\? | False | | 76 | | fullCalendar | bool | False | True | 77 | | fullCalendarScroll | FullCalendarScroll | False |FullCalendarScroll.vertical | 78 | | fullCalendarDay | WeekDay | False | WeekDay.short | 79 | | weekDay | WeekDay | False | WeekDay.short | 80 | | selectedDayPosition | SelectedDayPosition | False | SelectedDayPosition.left | 81 | 82 | --- 83 | 84 | 85 | 86 | ## Thank you 87 | Special thanks goes to all contributors to this package. Make sure to check them out.
88 | 89 | 90 | 91 | 92 | 93 | 94 | ## Donate 95 | You like the package ? Buy me a coffee :) 96 | 97 | 98 | 99 | buymeacoffe 100 | 101 | 102 | 103 | buymeacoffe 104 | 105 | -------------------------------------------------------------------------------- /dev_lib/calendar_agenda/assets/CalendarAppbarFalse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/dev_lib/calendar_agenda/assets/CalendarAppbarFalse.png -------------------------------------------------------------------------------- /dev_lib/calendar_agenda/assets/FullCalendarScrollHorizontal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/dev_lib/calendar_agenda/assets/FullCalendarScrollHorizontal.png -------------------------------------------------------------------------------- /dev_lib/calendar_agenda/assets/FullCalendarScrollVertical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/dev_lib/calendar_agenda/assets/FullCalendarScrollVertical.png -------------------------------------------------------------------------------- /dev_lib/calendar_agenda/assets/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/dev_lib/calendar_agenda/assets/demo.gif -------------------------------------------------------------------------------- /dev_lib/calendar_agenda/assets/selectedDayCenter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/dev_lib/calendar_agenda/assets/selectedDayCenter.png -------------------------------------------------------------------------------- /dev_lib/calendar_agenda/assets/selectedDayLeft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/dev_lib/calendar_agenda/assets/selectedDayLeft.png -------------------------------------------------------------------------------- /dev_lib/calendar_agenda/assets/selectedDayRight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/dev_lib/calendar_agenda/assets/selectedDayRight.png -------------------------------------------------------------------------------- /dev_lib/calendar_agenda/lib/calendar_agenda.dart: -------------------------------------------------------------------------------- 1 | library calendar_agenda; 2 | 3 | export 'src/typedata.dart'; 4 | export 'src/calendar.dart'; 5 | export 'src/controller.dart'; 6 | -------------------------------------------------------------------------------- /dev_lib/calendar_agenda/lib/src/controller.dart: -------------------------------------------------------------------------------- 1 | import 'calendar.dart'; 2 | 3 | // CalendarController 4 | class CalendarAgendaController { 5 | CalendarAgendaState? state; 6 | 7 | void bindState(CalendarAgendaState state) { 8 | this.state = state; 9 | } 10 | 11 | void goToDay(DateTime date) { 12 | state!.getDate(date); 13 | } 14 | 15 | void dispose() { 16 | state = null; 17 | } 18 | 19 | void openCalender(){ 20 | state!.showFullCalendar(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /dev_lib/calendar_agenda/lib/src/typedata.dart: -------------------------------------------------------------------------------- 1 | enum WeekDay { short, long } 2 | enum SelectedDayPosition { left, right, center } 3 | enum FullCalendarScroll { horizontal, vertical } 4 | -------------------------------------------------------------------------------- /dev_lib/calendar_agenda/pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "2.11.0" 12 | boolean_selector: 13 | dependency: transitive 14 | description: 15 | name: boolean_selector 16 | sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" 17 | url: "https://pub.dev" 18 | source: hosted 19 | version: "2.1.1" 20 | characters: 21 | dependency: transitive 22 | description: 23 | name: characters 24 | sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" 25 | url: "https://pub.dev" 26 | source: hosted 27 | version: "1.3.0" 28 | clock: 29 | dependency: transitive 30 | description: 31 | name: clock 32 | sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf 33 | url: "https://pub.dev" 34 | source: hosted 35 | version: "1.1.1" 36 | collection: 37 | dependency: transitive 38 | description: 39 | name: collection 40 | sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" 41 | url: "https://pub.dev" 42 | source: hosted 43 | version: "1.17.1" 44 | fake_async: 45 | dependency: transitive 46 | description: 47 | name: fake_async 48 | sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" 49 | url: "https://pub.dev" 50 | source: hosted 51 | version: "1.3.1" 52 | flutter: 53 | dependency: "direct main" 54 | description: flutter 55 | source: sdk 56 | version: "0.0.0" 57 | flutter_test: 58 | dependency: "direct dev" 59 | description: flutter 60 | source: sdk 61 | version: "0.0.0" 62 | intl: 63 | dependency: "direct main" 64 | description: 65 | name: intl 66 | sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" 67 | url: "https://pub.dev" 68 | source: hosted 69 | version: "0.18.1" 70 | js: 71 | dependency: transitive 72 | description: 73 | name: js 74 | sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 75 | url: "https://pub.dev" 76 | source: hosted 77 | version: "0.6.7" 78 | matcher: 79 | dependency: transitive 80 | description: 81 | name: matcher 82 | sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" 83 | url: "https://pub.dev" 84 | source: hosted 85 | version: "0.12.15" 86 | material_color_utilities: 87 | dependency: transitive 88 | description: 89 | name: material_color_utilities 90 | sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 91 | url: "https://pub.dev" 92 | source: hosted 93 | version: "0.2.0" 94 | meta: 95 | dependency: transitive 96 | description: 97 | name: meta 98 | sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" 99 | url: "https://pub.dev" 100 | source: hosted 101 | version: "1.9.1" 102 | path: 103 | dependency: transitive 104 | description: 105 | name: path 106 | sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" 107 | url: "https://pub.dev" 108 | source: hosted 109 | version: "1.8.3" 110 | scrollable_positioned_list: 111 | dependency: "direct main" 112 | description: 113 | name: scrollable_positioned_list 114 | sha256: f998e48b93314f29e27d31448c8f095d342e6680a020ed0b97524ccb85edf672 115 | url: "https://pub.dev" 116 | source: hosted 117 | version: "0.3.2" 118 | sky_engine: 119 | dependency: transitive 120 | description: flutter 121 | source: sdk 122 | version: "0.0.99" 123 | source_span: 124 | dependency: transitive 125 | description: 126 | name: source_span 127 | sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 128 | url: "https://pub.dev" 129 | source: hosted 130 | version: "1.9.1" 131 | stack_trace: 132 | dependency: transitive 133 | description: 134 | name: stack_trace 135 | sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 136 | url: "https://pub.dev" 137 | source: hosted 138 | version: "1.11.0" 139 | stream_channel: 140 | dependency: transitive 141 | description: 142 | name: stream_channel 143 | sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" 144 | url: "https://pub.dev" 145 | source: hosted 146 | version: "2.1.1" 147 | string_scanner: 148 | dependency: transitive 149 | description: 150 | name: string_scanner 151 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" 152 | url: "https://pub.dev" 153 | source: hosted 154 | version: "1.2.0" 155 | term_glyph: 156 | dependency: transitive 157 | description: 158 | name: term_glyph 159 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 160 | url: "https://pub.dev" 161 | source: hosted 162 | version: "1.2.1" 163 | test_api: 164 | dependency: transitive 165 | description: 166 | name: test_api 167 | sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb 168 | url: "https://pub.dev" 169 | source: hosted 170 | version: "0.5.1" 171 | vector_math: 172 | dependency: transitive 173 | description: 174 | name: vector_math 175 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" 176 | url: "https://pub.dev" 177 | source: hosted 178 | version: "2.1.4" 179 | sdks: 180 | dart: ">=3.0.0-0 <4.0.0" 181 | flutter: ">=2.12.0" 182 | -------------------------------------------------------------------------------- /dev_lib/calendar_agenda/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: calendar_agenda 2 | description: Calendar agenda widget with a lot of customizable styles, also can be put as appbar widget. 3 | version: 0.0.2+2 4 | homepage: https://github.com/sud0su/calendar_agenda 5 | 6 | environment: 7 | sdk: ">=2.12.0 <3.0.0" 8 | flutter: ">=1.17.0" 9 | 10 | dependencies: 11 | flutter: 12 | sdk: flutter 13 | intl: ^0.18.0 14 | scrollable_positioned_list: ^0.3.2 15 | 16 | dev_dependencies: 17 | flutter_test: 18 | sdk: flutter 19 | 20 | flutter: 21 | -------------------------------------------------------------------------------- /dev_lib/calendar_agenda/test/calendar_agenda_test.dart: -------------------------------------------------------------------------------- 1 | // import 'package:flutter_test/flutter_test.dart'; 2 | 3 | // import 'package:calendar_agenda/calendar_agenda.dart'; 4 | 5 | // void main() { 6 | // test('adds one to input values', () { 7 | // final calculator = Calculator(); 8 | // expect(calculator.addOne(2), 3); 9 | // expect(calculator.addOne(-7), -6); 10 | // expect(calculator.addOne(0), 1); 11 | // }); 12 | // } 13 | -------------------------------------------------------------------------------- /dev_lib/card_swiper/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## [Unreleased] 9 | 10 | ### Added 11 | 12 | ### Changed 13 | 14 | ### Deprecated 15 | 16 | ### Removed 17 | 18 | ### Fixed 19 | 20 | ### Security 21 | 22 | ## [3.0.1] - 2023-07-09 23 | 24 | ### Changed 25 | - README update 26 | 27 | ## [3.0.0] - 2023-07-09 28 | 29 | ### Fixed 30 | 31 | - [PR#59](https://github.com/TheAnkurPanchani/card_swiper/pull/59): hide items at the end of swiper if it's not looping 32 | - [PR#69](https://github.com/TheAnkurPanchani/card_swiper/pull/69): Fix STACK and TINDER auto wheel casting direction issues 33 | - [Issue#34](https://github.com/TheAnkurPanchani/card_swiper/issues/34): SwiperLayout.CUSTOM layout is not working as expected 34 | - [Issue#52](https://github.com/TheAnkurPanchani/card_swiper/issues/52): loop is not working 35 | - [Issue#62](https://github.com/TheAnkurPanchani/card_swiper/issues/62): Can I remove fake cards? 36 | 37 | ## [2.0.4] - 2022-06-05 38 | 39 | ### Fixed 40 | 41 | - [PR#46](https://github.com/TheAnkurPanchani/card_swiper/pull/46): `dart fix --apply` to support Flutter SDK 3.0 42 | - [Issue#47](https://github.com/TheAnkurPanchani/card_swiper/issues/47): cant work flutter 3.0 43 | - [Issue#48](https://github.com/TheAnkurPanchani/card_swiper/issues/48): Not supported for Flutter 3.0 44 | - [Issue#49](https://github.com/TheAnkurPanchani/card_swiper/issues/49): 建议升级一下3.0 45 | - [Issue#50](https://github.com/TheAnkurPanchani/card_swiper/issues/50): not supporting v3 flutter 46 | 47 | ## [2.0.3] - 2022-03-13 48 | 49 | ### Added 50 | 51 | - [PR#29](https://github.com/TheAnkurPanchani/card_swiper/pull/29): Add allowImplicitScrolling property 52 | 53 | ### Fixed 54 | 55 | - [PR#28](https://github.com/TheAnkurPanchani/card_swiper/pull/28): make page indicators respect the initial page index 56 | 57 | ## [2.0.2] - 2022-03-13 58 | 59 | ### Fixed 60 | 61 | - [Issue#12](https://github.com/TheAnkurPanchani/card_swiper/issues/12): Use default pagination only if value is not provided 62 | - [Issue#15](https://github.com/TheAnkurPanchani/card_swiper/issues/15): Put item count check before building animation 63 | - [Issue#24](https://github.com/TheAnkurPanchani/card_swiper/issues/24): Put mounted check on post-frame callbacks 64 | - [Issue#30](https://github.com/TheAnkurPanchani/card_swiper/issues/30): Fix order for right direction of stack layout 65 | - [Issue#31](https://github.com/TheAnkurPanchani/card_swiper/issues/31): Update README for custom layout options 66 | - [Issue#32](https://github.com/TheAnkurPanchani/card_swiper/issues/32): Update README to mention how to not get default controls and pagination 67 | 68 | ## [2.0.1] - 2022-01-11 69 | 70 | ### Added 71 | 72 | - [Issue#3](https://github.com/TheAnkurPanchani/card_swiper/issues/3): Support `AxisDirection` left and right for Stack layout 73 | 74 | ### Fixed 75 | 76 | - Fix pan event index update for custom layout 77 | 78 | ## [2.0.0] - 2022-01-09 79 | 80 | ### Changed 81 | 82 | - [PR#17](https://github.com/TheAnkurPanchani/card_swiper/pull/17): Migrate from `pedantic` to `flutter_lints_plus` and fix problems related to lint 83 | 84 | ## [1.0.4] - 2021-08-06 85 | 86 | ### Fixed 87 | 88 | - Initial index should set from controller is provided in parameter 89 | - Update readme 90 | 91 | ## [1.0.3] - 2021-08-06 92 | 93 | ### Fixed 94 | 95 | - Initial index should set from controller is provided in parameter 96 | 97 | ## [1.0.2] - 2017-06-20 98 | 99 | ### Fixed 100 | 101 | - README text and references 102 | - Library name 103 | - Example reference 104 | - Format according to dartfmt 105 | 106 | ## [1.0.1] - 2017-06-20 107 | 108 | ### Fixed 109 | 110 | - Format according to dartfmt 111 | 112 | ## [1.0.0] - 2017-06-20 113 | 114 | - First release after fork 115 | -------------------------------------------------------------------------------- /dev_lib/card_swiper/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright 2021 Ankur Panchani 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | 11 | -------------------------------------------------------------------------------- /dev_lib/card_swiper/analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:flutter_lints_plus/flutter.yaml 2 | 3 | linter: 4 | rules: 5 | prefer_relative_imports: false 6 | sort_pub_dependencies: false 7 | # avoid_print: false # Uncomment to disable the `avoid_print` rule 8 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 9 | # Additional information about this file can be found at 10 | # https://dart.dev/guides/language/analysis-options 11 | -------------------------------------------------------------------------------- /dev_lib/card_swiper/banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/dev_lib/card_swiper/banner.jpg -------------------------------------------------------------------------------- /dev_lib/card_swiper/dev/bots/travis_install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "$PWD" 4 | export ROOT="$PWD" 5 | 6 | mkdir ~/development 7 | 8 | cd ~/development 9 | wget https://storage.googleapis.com/flutter_infra/releases/beta/linux/flutter_linux_v0.4.4-beta.tar.xz 10 | tar xf ~/development/flutter_linux_v0.4.4-beta.tar.xz 11 | 12 | export PATH=~/development/flutter/bin:$PATH 13 | 14 | 15 | cd $ROOT 16 | flutter packages get 17 | 18 | gem install coveralls-lcov 19 | -------------------------------------------------------------------------------- /dev_lib/card_swiper/dev/bots/travis_script.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -ex 3 | 4 | export PATH=~/development/flutter/bin:$PATH 5 | export ROOT="$PWD" 6 | 7 | if [[ "$SHARD" == "dartfmt" ]]; then 8 | echo 'Formating code' 9 | cd $ROOT 10 | flutter format . || exit $? 11 | else 12 | # tests shard 13 | cd $ROOT 14 | 15 | flutter test --coverage test/* || exit $? 16 | 17 | fi 18 | -------------------------------------------------------------------------------- /dev_lib/card_swiper/lib/card_swiper.dart: -------------------------------------------------------------------------------- 1 | /// This library is for swiper 2 | library card_swiper; 3 | 4 | export 'src/flutter_page_indicator/flutter_page_indicator.dart'; 5 | export 'src/swiper.dart'; 6 | export 'src/swiper_control.dart'; 7 | export 'src/swiper_controller.dart'; 8 | export 'src/swiper_pagination.dart'; 9 | export 'src/swiper_plugin.dart'; 10 | export 'src/transformer_page_view/index_controller.dart'; 11 | -------------------------------------------------------------------------------- /dev_lib/card_swiper/lib/src/swiper_control.dart: -------------------------------------------------------------------------------- 1 | import 'package:card_swiper/card_swiper.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class SwiperControl extends SwiperPlugin { 5 | const SwiperControl({ 6 | this.iconPrevious = Icons.arrow_back_ios, 7 | this.iconNext = Icons.arrow_forward_ios, 8 | this.color, 9 | this.disableColor, 10 | this.key, 11 | this.size = 30.0, 12 | this.padding = const EdgeInsets.all(5.0), 13 | }); 14 | 15 | ///IconData for previous 16 | final IconData iconPrevious; 17 | 18 | ///iconData for next 19 | final IconData iconNext; 20 | 21 | ///icon size 22 | final double size; 23 | 24 | ///Icon normal color, The theme's [ThemeData.primaryColor] by default. 25 | final Color? color; 26 | 27 | ///if set loop=false on Swiper, this color will be used when swiper goto the last slide. 28 | ///The theme's [ThemeData.disabledColor] by default. 29 | final Color? disableColor; 30 | 31 | final EdgeInsetsGeometry padding; 32 | 33 | final Key? key; 34 | 35 | Widget buildButton({ 36 | required SwiperPluginConfig? config, 37 | required Color color, 38 | required IconData iconData, 39 | required int quarterTurns, 40 | required bool previous, 41 | }) { 42 | return GestureDetector( 43 | behavior: HitTestBehavior.opaque, 44 | onTap: () async { 45 | if (previous) { 46 | await config!.controller.previous(animation: true); 47 | } else { 48 | await config!.controller.next(animation: true); 49 | } 50 | }, 51 | child: Padding( 52 | padding: padding, 53 | child: RotatedBox( 54 | quarterTurns: quarterTurns, 55 | child: Icon( 56 | iconData, 57 | semanticLabel: previous ? 'Previous' : 'Next', 58 | size: size, 59 | color: color, 60 | ))), 61 | ); 62 | } 63 | 64 | @override 65 | Widget build(BuildContext context, SwiperPluginConfig config) { 66 | final themeData = Theme.of(context); 67 | 68 | final color = this.color ?? themeData.primaryColor; 69 | final disableColor = this.disableColor ?? themeData.disabledColor; 70 | Color prevColor; 71 | Color nextColor; 72 | 73 | if (config.loop) { 74 | prevColor = nextColor = color; 75 | } else { 76 | final next = config.activeIndex < config.itemCount - 1; 77 | final prev = config.activeIndex > 0; 78 | prevColor = prev ? color : disableColor; 79 | nextColor = next ? color : disableColor; 80 | } 81 | 82 | Widget child; 83 | if (config.scrollDirection == Axis.horizontal) { 84 | child = Row( 85 | key: key, 86 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 87 | children: [ 88 | buildButton( 89 | config: config, 90 | color: prevColor, 91 | iconData: iconPrevious, 92 | quarterTurns: 0, 93 | previous: true, 94 | ), 95 | buildButton( 96 | config: config, 97 | color: nextColor, 98 | iconData: iconNext, 99 | quarterTurns: 0, 100 | previous: false, 101 | ) 102 | ], 103 | ); 104 | } else { 105 | child = Column( 106 | key: key, 107 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 108 | children: [ 109 | buildButton( 110 | config: config, 111 | color: prevColor, 112 | iconData: iconPrevious, 113 | quarterTurns: -3, 114 | previous: true, 115 | ), 116 | buildButton( 117 | config: config, 118 | color: nextColor, 119 | iconData: iconNext, 120 | quarterTurns: -3, 121 | previous: false, 122 | ) 123 | ], 124 | ); 125 | } 126 | 127 | return SizedBox.expand( 128 | child: child, 129 | ); 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /dev_lib/card_swiper/lib/src/swiper_controller.dart: -------------------------------------------------------------------------------- 1 | import 'swiper_plugin.dart'; 2 | import 'transformer_page_view/index_controller.dart'; 3 | 4 | class SwipeIndexControllerEvent extends IndexControllerEventBase { 5 | SwipeIndexControllerEvent({ 6 | required this.pos, 7 | required bool animation, 8 | }) : super(animation: animation); 9 | final double pos; 10 | } 11 | 12 | class BuildIndexControllerEvent extends IndexControllerEventBase { 13 | BuildIndexControllerEvent({ 14 | required bool animation, 15 | required this.config, 16 | }) : super(animation: animation); 17 | final SwiperPluginConfig config; 18 | } 19 | 20 | class AutoPlaySwiperControllerEvent extends IndexControllerEventBase { 21 | AutoPlaySwiperControllerEvent({ 22 | required bool animation, 23 | required this.autoplay, 24 | }) : super(animation: animation); 25 | 26 | AutoPlaySwiperControllerEvent.start({ 27 | required bool animation, 28 | }) : this(animation: animation, autoplay: true); 29 | AutoPlaySwiperControllerEvent.stop({ 30 | required bool animation, 31 | }) : this(animation: animation, autoplay: false); 32 | final bool autoplay; 33 | } 34 | 35 | class SwiperController extends IndexController { 36 | void startAutoplay({bool animation = true}) { 37 | event = AutoPlaySwiperControllerEvent.start(animation: animation); 38 | notifyListeners(); 39 | } 40 | 41 | void stopAutoplay({bool animation = true}) { 42 | event = AutoPlaySwiperControllerEvent.stop(animation: animation); 43 | notifyListeners(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /dev_lib/card_swiper/lib/src/swiper_pagination.dart: -------------------------------------------------------------------------------- 1 | import 'dart:developer'; 2 | 3 | import 'package:flutter/material.dart'; 4 | 5 | import '../card_swiper.dart'; 6 | 7 | class FractionPaginationBuilder extends SwiperPlugin { 8 | const FractionPaginationBuilder({ 9 | this.color, 10 | this.fontSize = 20.0, 11 | this.key, 12 | this.activeColor, 13 | this.activeFontSize = 35.0, 14 | }); 15 | 16 | ///color ,if set null , will be Theme.of(context).scaffoldBackgroundColor 17 | final Color? color; 18 | 19 | ///color when active,if set null , will be Theme.of(context).primaryColor 20 | final Color? activeColor; 21 | 22 | ////font size 23 | final double fontSize; 24 | 25 | ///font size when active 26 | final double activeFontSize; 27 | 28 | final Key? key; 29 | 30 | @override 31 | Widget build(BuildContext context, SwiperPluginConfig? config) { 32 | final themeData = Theme.of(context); 33 | final activeColor = this.activeColor ?? themeData.primaryColor; 34 | final color = this.color ?? themeData.scaffoldBackgroundColor; 35 | 36 | if (Axis.vertical == config!.scrollDirection) { 37 | return Column( 38 | key: key, 39 | mainAxisSize: MainAxisSize.min, 40 | children: [ 41 | Text( 42 | '${config.activeIndex + 1}', 43 | style: TextStyle(color: activeColor, fontSize: activeFontSize), 44 | ), 45 | Text( 46 | '/', 47 | style: TextStyle(color: color, fontSize: fontSize), 48 | ), 49 | Text( 50 | '${config.itemCount}', 51 | style: TextStyle(color: color, fontSize: fontSize), 52 | ) 53 | ], 54 | ); 55 | } else { 56 | return Row( 57 | key: key, 58 | mainAxisSize: MainAxisSize.min, 59 | children: [ 60 | Text( 61 | '${config.activeIndex + 1}', 62 | style: TextStyle(color: activeColor, fontSize: activeFontSize), 63 | ), 64 | Text( 65 | ' / ${config.itemCount}', 66 | style: TextStyle(color: color, fontSize: fontSize), 67 | ) 68 | ], 69 | ); 70 | } 71 | } 72 | } 73 | 74 | class RectSwiperPaginationBuilder extends SwiperPlugin { 75 | const RectSwiperPaginationBuilder({ 76 | this.activeColor, 77 | this.color, 78 | this.key, 79 | this.size = const Size(10.0, 2.0), 80 | this.activeSize = const Size(10.0, 2.0), 81 | this.space = 3.0, 82 | }); 83 | 84 | ///color when current index,if set null , will be Theme.of(context).primaryColor 85 | final Color? activeColor; 86 | 87 | ///,if set null , will be Theme.of(context).scaffoldBackgroundColor 88 | final Color? color; 89 | 90 | ///Size of the rect when activate 91 | final Size activeSize; 92 | 93 | ///Size of the rect 94 | final Size size; 95 | 96 | /// Space between rects 97 | final double space; 98 | 99 | final Key? key; 100 | 101 | @override 102 | Widget build(BuildContext context, SwiperPluginConfig config) { 103 | final themeData = Theme.of(context); 104 | final activeColor = this.activeColor ?? themeData.primaryColor; 105 | final color = this.color ?? themeData.scaffoldBackgroundColor; 106 | 107 | final list = []; 108 | 109 | final itemCount = config.itemCount; 110 | final activeIndex = config.activeIndex; 111 | if (itemCount > 20) { 112 | log( 113 | 'The itemCount is too big, we suggest use FractionPaginationBuilder ' 114 | 'instead of DotSwiperPaginationBuilder in this situation', 115 | ); 116 | } 117 | 118 | for (var i = 0; i < itemCount; ++i) { 119 | final active = i == activeIndex; 120 | final size = active ? activeSize : this.size; 121 | list.add(SizedBox( 122 | width: size.width, 123 | height: size.height, 124 | child: Container( 125 | color: active ? activeColor : color, 126 | key: Key('pagination_$i'), 127 | margin: EdgeInsets.all(space), 128 | ), 129 | )); 130 | } 131 | 132 | if (config.scrollDirection == Axis.vertical) { 133 | return Column( 134 | key: key, 135 | mainAxisSize: MainAxisSize.min, 136 | children: list, 137 | ); 138 | } else { 139 | return Row( 140 | key: key, 141 | mainAxisSize: MainAxisSize.min, 142 | children: list, 143 | ); 144 | } 145 | } 146 | } 147 | 148 | class DotSwiperPaginationBuilder extends SwiperPlugin { 149 | const DotSwiperPaginationBuilder({ 150 | this.activeColor, 151 | this.color, 152 | this.key, 153 | this.size = 10.0, 154 | this.activeSize = 10.0, 155 | this.space = 3.0, 156 | }); 157 | 158 | ///color when current index,if set null , will be Theme.of(context).primaryColor 159 | final Color? activeColor; 160 | 161 | ///,if set null , will be Theme.of(context).scaffoldBackgroundColor 162 | final Color? color; 163 | 164 | ///Size of the dot when activate 165 | final double activeSize; 166 | 167 | ///Size of the dot 168 | final double size; 169 | 170 | /// Space between dots 171 | final double space; 172 | 173 | final Key? key; 174 | 175 | @override 176 | Widget build(BuildContext context, SwiperPluginConfig config) { 177 | if (config.itemCount > 20) { 178 | log( 179 | 'The itemCount is too big, we suggest use FractionPaginationBuilder ' 180 | 'instead of DotSwiperPaginationBuilder in this situation', 181 | ); 182 | } 183 | var activeColor = this.activeColor; 184 | var color = this.color; 185 | 186 | if (activeColor == null || color == null) { 187 | final themeData = Theme.of(context); 188 | activeColor = this.activeColor ?? themeData.primaryColor; 189 | color = this.color ?? themeData.scaffoldBackgroundColor; 190 | } 191 | 192 | if (config.indicatorLayout != PageIndicatorLayout.NONE && 193 | config.layout == SwiperLayout.DEFAULT) { 194 | return PageIndicator( 195 | count: config.itemCount, 196 | controller: config.pageController!, 197 | layout: config.indicatorLayout, 198 | size: size, 199 | activeColor: activeColor, 200 | color: color, 201 | space: space, 202 | ); 203 | } 204 | 205 | final list = []; 206 | 207 | final itemCount = config.itemCount; 208 | final activeIndex = config.activeIndex; 209 | 210 | for (var i = 0; i < itemCount; ++i) { 211 | final active = i == activeIndex; 212 | list.add(Container( 213 | key: Key('pagination_$i'), 214 | margin: EdgeInsets.all(space), 215 | child: ClipOval( 216 | child: Container( 217 | color: active ? activeColor : color, 218 | width: active ? activeSize : size, 219 | height: active ? activeSize : size, 220 | ), 221 | ), 222 | )); 223 | } 224 | 225 | if (config.scrollDirection == Axis.vertical) { 226 | return Column( 227 | key: key, 228 | mainAxisSize: MainAxisSize.min, 229 | children: list, 230 | ); 231 | } else { 232 | return Row( 233 | key: key, 234 | mainAxisSize: MainAxisSize.min, 235 | children: list, 236 | ); 237 | } 238 | } 239 | } 240 | 241 | typedef SwiperPaginationBuilder = Widget Function( 242 | BuildContext context, 243 | SwiperPluginConfig config, 244 | ); 245 | 246 | class SwiperCustomPagination extends SwiperPlugin { 247 | const SwiperCustomPagination({required this.builder}); 248 | 249 | final SwiperPaginationBuilder builder; 250 | 251 | @override 252 | Widget build(BuildContext context, SwiperPluginConfig config) { 253 | return builder(context, config); 254 | } 255 | } 256 | 257 | class SwiperPagination extends SwiperPlugin { 258 | const SwiperPagination({ 259 | this.alignment, 260 | this.key, 261 | this.margin = const EdgeInsets.all(10.0), 262 | this.builder = SwiperPagination.dots, 263 | }); 264 | 265 | /// dot style pagination 266 | static const SwiperPlugin dots = DotSwiperPaginationBuilder(); 267 | 268 | /// fraction style pagination 269 | static const SwiperPlugin fraction = FractionPaginationBuilder(); 270 | 271 | static const SwiperPlugin rect = RectSwiperPaginationBuilder(); 272 | 273 | /// Alignment.bottomCenter by default when scrollDirection== Axis.horizontal 274 | /// Alignment.centerRight by default when scrollDirection== Axis.vertical 275 | final Alignment? alignment; 276 | 277 | /// Distance between pagination and the container 278 | final EdgeInsetsGeometry margin; 279 | 280 | /// Build the widget 281 | final SwiperPlugin builder; 282 | 283 | final Key? key; 284 | 285 | @override 286 | Widget build(BuildContext context, SwiperPluginConfig config) { 287 | final defaultAlignment = config.scrollDirection == Axis.horizontal 288 | ? Alignment.bottomCenter 289 | : Alignment.centerRight; 290 | Widget child = Container( 291 | margin: margin, 292 | child: builder.build(context, config), 293 | ); 294 | if (!config.outer!) { 295 | child = Align( 296 | key: key, 297 | alignment: alignment ?? defaultAlignment, 298 | child: child, 299 | ); 300 | } 301 | return child; 302 | } 303 | } 304 | -------------------------------------------------------------------------------- /dev_lib/card_swiper/lib/src/swiper_plugin.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/widgets.dart'; 2 | 3 | import '../card_swiper.dart'; 4 | 5 | /// plugin to display swiper components 6 | /// 7 | abstract class SwiperPlugin { 8 | const SwiperPlugin(); 9 | 10 | Widget build(BuildContext context, SwiperPluginConfig config); 11 | } 12 | 13 | class SwiperPluginConfig { 14 | const SwiperPluginConfig({ 15 | required this.scrollDirection, 16 | required this.controller, 17 | required this.activeIndex, 18 | required this.itemCount, 19 | this.axisDirection, 20 | this.indicatorLayout, 21 | this.outer, 22 | this.pageController, 23 | this.layout, 24 | this.loop = false, 25 | }); 26 | 27 | final Axis scrollDirection; 28 | final AxisDirection? axisDirection; 29 | final SwiperController controller; 30 | final int activeIndex; 31 | final int itemCount; 32 | final PageIndicatorLayout? indicatorLayout; 33 | final bool loop; 34 | final bool? outer; 35 | final PageController? pageController; 36 | final SwiperLayout? layout; 37 | } 38 | 39 | class SwiperPluginView extends StatelessWidget { 40 | const SwiperPluginView({ 41 | Key? key, 42 | required this.plugin, 43 | required this.config, 44 | }) : super(key: key); 45 | 46 | final SwiperPlugin plugin; 47 | final SwiperPluginConfig config; 48 | 49 | @override 50 | Widget build(BuildContext context) { 51 | return plugin.build(context, config); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /dev_lib/card_swiper/lib/src/transformer_page_view/index_controller.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:flutter/foundation.dart'; 4 | import 'package:flutter/widgets.dart'; 5 | 6 | abstract class IndexControllerEventBase { 7 | IndexControllerEventBase({ 8 | required this.animation, 9 | }); 10 | 11 | final bool animation; 12 | 13 | final completer = Completer(); 14 | Future get future => completer.future; 15 | void complete() { 16 | if (!completer.isCompleted) { 17 | completer.complete(); 18 | } 19 | } 20 | } 21 | 22 | mixin TargetedPositionControllerEvent on IndexControllerEventBase { 23 | double get targetPosition; 24 | } 25 | mixin StepBasedIndexControllerEvent on TargetedPositionControllerEvent { 26 | int get step; 27 | int calcNextIndex({ 28 | required int currentIndex, 29 | required int itemCount, 30 | required bool loop, 31 | required bool reverse, 32 | }) { 33 | var cIndex = currentIndex; 34 | if (reverse) { 35 | cIndex -= step; 36 | } else { 37 | cIndex += step; 38 | } 39 | 40 | if (!loop) { 41 | if (cIndex >= itemCount) { 42 | cIndex = itemCount - 1; 43 | } else if (cIndex < 0) { 44 | cIndex = 0; 45 | } 46 | } 47 | return cIndex; 48 | } 49 | } 50 | 51 | class NextIndexControllerEvent extends IndexControllerEventBase 52 | with TargetedPositionControllerEvent, StepBasedIndexControllerEvent { 53 | NextIndexControllerEvent({ 54 | required bool animation, 55 | }) : super( 56 | animation: animation, 57 | ); 58 | 59 | @override 60 | int get step => 1; 61 | 62 | @override 63 | double get targetPosition => 0; 64 | } 65 | 66 | class PrevIndexControllerEvent extends IndexControllerEventBase 67 | with TargetedPositionControllerEvent, StepBasedIndexControllerEvent { 68 | PrevIndexControllerEvent({ 69 | required bool animation, 70 | }) : super( 71 | animation: animation, 72 | ); 73 | @override 74 | int get step => -1; 75 | 76 | @override 77 | double get targetPosition => 1; 78 | } 79 | 80 | class MoveIndexControllerEvent extends IndexControllerEventBase 81 | with TargetedPositionControllerEvent { 82 | MoveIndexControllerEvent({ 83 | required this.newIndex, 84 | required this.oldIndex, 85 | required bool animation, 86 | }) : super( 87 | animation: animation, 88 | ); 89 | final int newIndex; 90 | final int oldIndex; 91 | @override 92 | double get targetPosition => newIndex > oldIndex ? 1 : 0; 93 | } 94 | 95 | class IndexController extends ChangeNotifier { 96 | IndexControllerEventBase? event; 97 | int index = 0; 98 | Future move(int index, {bool animation = true}) { 99 | final e = event = MoveIndexControllerEvent( 100 | animation: animation, 101 | newIndex: index, 102 | oldIndex: this.index, 103 | ); 104 | notifyListeners(); 105 | return e.future; 106 | } 107 | 108 | Future next({bool animation = true}) { 109 | final e = event = NextIndexControllerEvent(animation: animation); 110 | notifyListeners(); 111 | return e.future; 112 | } 113 | 114 | Future previous({bool animation = true}) { 115 | final e = event = PrevIndexControllerEvent(animation: animation); 116 | notifyListeners(); 117 | return e.future; 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /dev_lib/card_swiper/lib/src/transformer_page_view/parallax.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/widgets.dart'; 2 | 3 | import 'transformer_page_view.dart'; 4 | 5 | // typedef PaintCallback = Function(Canvas canvas, Size size); 6 | 7 | class ColorPainter extends CustomPainter { 8 | ColorPainter(this._paint, this.info, this.colors); 9 | 10 | final Paint _paint; 11 | final TransformInfo info; 12 | final List colors; 13 | 14 | @override 15 | void paint(Canvas canvas, Size size) { 16 | final index = info.fromIndex; 17 | _paint.color = colors[index]; 18 | canvas.drawRect(Rect.fromLTWH(0.0, 0.0, size.width, size.height), _paint); 19 | if (info.done!) { 20 | return; 21 | } 22 | int alpha; 23 | int color; 24 | double opacity; 25 | final position = info.position; 26 | if (info.forward!) { 27 | if (index < colors.length - 1) { 28 | color = colors[index + 1].value & 0x00ffffff; 29 | opacity = (position! <= 0 30 | ? (-position / info.viewportFraction!) 31 | : 1 - position / info.viewportFraction!); 32 | if (opacity > 1) { 33 | opacity -= 1.0; 34 | } 35 | if (opacity < 0) { 36 | opacity += 1.0; 37 | } 38 | alpha = (0xff * opacity).toInt(); 39 | 40 | _paint.color = Color((alpha << 24) | color); 41 | canvas.drawRect( 42 | Rect.fromLTWH(0.0, 0.0, size.width, size.height), _paint); 43 | } 44 | } else { 45 | if (index > 0) { 46 | color = colors[index - 1].value & 0x00ffffff; 47 | opacity = (position! > 0 48 | ? position / info.viewportFraction! 49 | : (1 + position / info.viewportFraction!)); 50 | if (opacity > 1) { 51 | opacity -= 1.0; 52 | } 53 | if (opacity < 0) { 54 | opacity += 1.0; 55 | } 56 | alpha = (0xff * opacity).toInt(); 57 | 58 | _paint.color = Color((alpha << 24) | color); 59 | canvas.drawRect( 60 | Rect.fromLTWH(0.0, 0.0, size.width, size.height), _paint); 61 | } 62 | } 63 | } 64 | 65 | @override 66 | bool shouldRepaint(ColorPainter oldDelegate) { 67 | return oldDelegate.info != info; 68 | } 69 | } 70 | 71 | class _ParallaxColorState extends State { 72 | Paint paint = Paint(); 73 | 74 | @override 75 | Widget build(BuildContext context) { 76 | return CustomPaint( 77 | painter: ColorPainter(paint, widget.info, widget.colors), 78 | child: widget.child, 79 | ); 80 | } 81 | } 82 | 83 | class ParallaxColor extends StatefulWidget { 84 | const ParallaxColor({ 85 | Key? key, 86 | required this.child, 87 | required this.colors, 88 | required this.info, 89 | }) : super(key: key); 90 | 91 | final Widget child; 92 | 93 | final List colors; 94 | 95 | final TransformInfo info; 96 | 97 | @override 98 | State createState() { 99 | return _ParallaxColorState(); 100 | } 101 | } 102 | 103 | class ParallaxContainer extends StatelessWidget { 104 | const ParallaxContainer({ 105 | Key? key, 106 | required this.child, 107 | required this.position, 108 | this.translationFactor = 100.0, 109 | this.opacityFactor = 1.0, 110 | }) : super(key: key); 111 | 112 | final Widget child; 113 | final double position; 114 | final double translationFactor; 115 | final double opacityFactor; 116 | 117 | @override 118 | Widget build(BuildContext context) { 119 | return Opacity( 120 | opacity: (1 - position.abs()).clamp(0.0, 1.0) * opacityFactor, 121 | child: Transform.translate( 122 | offset: Offset(position * translationFactor, 0.0), 123 | child: child, 124 | ), 125 | ); 126 | } 127 | } 128 | 129 | class ParallaxImage extends StatelessWidget { 130 | ParallaxImage.asset( 131 | String name, { 132 | Key? key, 133 | required double position, 134 | this.imageFactor = 0.3, 135 | }) : image = Image.asset( 136 | name, 137 | fit: BoxFit.cover, 138 | alignment: FractionalOffset( 139 | 0.5 + position * imageFactor, 140 | 0.5, 141 | ), 142 | ), 143 | super(key: key); 144 | 145 | final Image image; 146 | final double imageFactor; 147 | 148 | @override 149 | Widget build(BuildContext context) { 150 | return image; 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /dev_lib/card_swiper/pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "2.11.0" 12 | boolean_selector: 13 | dependency: transitive 14 | description: 15 | name: boolean_selector 16 | sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" 17 | url: "https://pub.dev" 18 | source: hosted 19 | version: "2.1.1" 20 | characters: 21 | dependency: transitive 22 | description: 23 | name: characters 24 | sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" 25 | url: "https://pub.dev" 26 | source: hosted 27 | version: "1.3.0" 28 | clock: 29 | dependency: transitive 30 | description: 31 | name: clock 32 | sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf 33 | url: "https://pub.dev" 34 | source: hosted 35 | version: "1.1.1" 36 | collection: 37 | dependency: transitive 38 | description: 39 | name: collection 40 | sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" 41 | url: "https://pub.dev" 42 | source: hosted 43 | version: "1.17.1" 44 | fake_async: 45 | dependency: transitive 46 | description: 47 | name: fake_async 48 | sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" 49 | url: "https://pub.dev" 50 | source: hosted 51 | version: "1.3.1" 52 | flutter: 53 | dependency: "direct main" 54 | description: flutter 55 | source: sdk 56 | version: "0.0.0" 57 | flutter_lints: 58 | dependency: transitive 59 | description: 60 | name: flutter_lints 61 | sha256: "2118df84ef0c3ca93f96123a616ae8540879991b8b57af2f81b76a7ada49b2a4" 62 | url: "https://pub.dev" 63 | source: hosted 64 | version: "2.0.2" 65 | flutter_lints_plus: 66 | dependency: "direct dev" 67 | description: 68 | name: flutter_lints_plus 69 | sha256: "1fe596cfd38b8af8e9a94fa52e3b5cd5b3cbd99a5cf4841f949ef9d4b78d8cbe" 70 | url: "https://pub.dev" 71 | source: hosted 72 | version: "3.0.1" 73 | flutter_test: 74 | dependency: "direct dev" 75 | description: flutter 76 | source: sdk 77 | version: "0.0.0" 78 | js: 79 | dependency: transitive 80 | description: 81 | name: js 82 | sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 83 | url: "https://pub.dev" 84 | source: hosted 85 | version: "0.6.7" 86 | lints: 87 | dependency: transitive 88 | description: 89 | name: lints 90 | sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" 91 | url: "https://pub.dev" 92 | source: hosted 93 | version: "2.1.1" 94 | matcher: 95 | dependency: transitive 96 | description: 97 | name: matcher 98 | sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" 99 | url: "https://pub.dev" 100 | source: hosted 101 | version: "0.12.15" 102 | material_color_utilities: 103 | dependency: transitive 104 | description: 105 | name: material_color_utilities 106 | sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 107 | url: "https://pub.dev" 108 | source: hosted 109 | version: "0.2.0" 110 | meta: 111 | dependency: transitive 112 | description: 113 | name: meta 114 | sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" 115 | url: "https://pub.dev" 116 | source: hosted 117 | version: "1.9.1" 118 | path: 119 | dependency: transitive 120 | description: 121 | name: path 122 | sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" 123 | url: "https://pub.dev" 124 | source: hosted 125 | version: "1.8.3" 126 | sky_engine: 127 | dependency: transitive 128 | description: flutter 129 | source: sdk 130 | version: "0.0.99" 131 | source_span: 132 | dependency: transitive 133 | description: 134 | name: source_span 135 | sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 136 | url: "https://pub.dev" 137 | source: hosted 138 | version: "1.9.1" 139 | stack_trace: 140 | dependency: transitive 141 | description: 142 | name: stack_trace 143 | sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 144 | url: "https://pub.dev" 145 | source: hosted 146 | version: "1.11.0" 147 | stream_channel: 148 | dependency: transitive 149 | description: 150 | name: stream_channel 151 | sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" 152 | url: "https://pub.dev" 153 | source: hosted 154 | version: "2.1.1" 155 | string_scanner: 156 | dependency: transitive 157 | description: 158 | name: string_scanner 159 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" 160 | url: "https://pub.dev" 161 | source: hosted 162 | version: "1.2.0" 163 | term_glyph: 164 | dependency: transitive 165 | description: 166 | name: term_glyph 167 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 168 | url: "https://pub.dev" 169 | source: hosted 170 | version: "1.2.1" 171 | test_api: 172 | dependency: transitive 173 | description: 174 | name: test_api 175 | sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb 176 | url: "https://pub.dev" 177 | source: hosted 178 | version: "0.5.1" 179 | vector_math: 180 | dependency: transitive 181 | description: 182 | name: vector_math 183 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" 184 | url: "https://pub.dev" 185 | source: hosted 186 | version: "2.1.4" 187 | sdks: 188 | dart: ">=3.0.0 <4.0.0" 189 | flutter: ">=0.1.4" 190 | -------------------------------------------------------------------------------- /dev_lib/card_swiper/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: card_swiper 2 | description: swiper/carousel for flutter, with multiple layouts, infinite loop. Compatible with Android & iOS. 3 | version: 3.0.1 4 | homepage: https://github.com/TheAnkurPanchani/flutter_swiper 5 | 6 | dependencies: 7 | flutter: 8 | sdk: flutter 9 | 10 | environment: 11 | sdk: ">=2.15.0 <4.0.0" 12 | flutter: ">=0.1.4" 13 | 14 | dev_dependencies: 15 | flutter_lints_plus: ">=2.0.0 <4.0.0" 16 | flutter_test: 17 | sdk: flutter 18 | 19 | flutter: 20 | -------------------------------------------------------------------------------- /dev_lib/card_swiper/test/control_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:card_swiper/card_swiper.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_test/flutter_test.dart'; 4 | 5 | void main() { 6 | testWidgets('Control horizontal', (tester) async { 7 | final controller = SwiperController(); 8 | 9 | final config = SwiperPluginConfig( 10 | activeIndex: 0, 11 | controller: controller, 12 | itemCount: 10, 13 | loop: true, 14 | scrollDirection: Axis.horizontal, 15 | ); 16 | 17 | final key = UniqueKey(); 18 | await tester.pumpWidget(MaterialApp( 19 | home: Scaffold(body: Builder(builder: (context) { 20 | return SwiperControl(key: key).build(context, config); 21 | })), 22 | )); 23 | 24 | expect(find.byKey(key), findsOneWidget); 25 | 26 | var first = true; 27 | 28 | await tester.tap(find.byWidgetPredicate((widget) { 29 | if (widget is GestureDetector && first) { 30 | first = false; 31 | return true; 32 | } 33 | 34 | return false; 35 | })); 36 | }); 37 | 38 | testWidgets('Control vertical', (tester) async { 39 | final controller = SwiperController(); 40 | 41 | final config = SwiperPluginConfig( 42 | activeIndex: 0, 43 | controller: controller, 44 | itemCount: 10, 45 | loop: true, 46 | scrollDirection: Axis.vertical); 47 | 48 | final Key key = UniqueKey(); 49 | await tester.pumpWidget(MaterialApp( 50 | home: Scaffold(body: Builder(builder: (context) { 51 | return SwiperControl( 52 | key: key, color: Colors.white, disableColor: Colors.black87) 53 | .build(context, config); 54 | })), 55 | )); 56 | 57 | expect(find.byKey(key), findsOneWidget); 58 | 59 | var first = true; 60 | 61 | await tester.tap(find.byWidgetPredicate((widget) { 62 | if (widget is GestureDetector && first) { 63 | first = false; 64 | return true; 65 | } 66 | 67 | return false; 68 | })); 69 | }); 70 | } 71 | -------------------------------------------------------------------------------- /dev_lib/card_swiper/test/flutter_swiper_test.dart: -------------------------------------------------------------------------------- 1 | // ignore_for_file: cascade_invocations 2 | 3 | import 'package:card_swiper/card_swiper.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:flutter_test/flutter_test.dart'; 6 | 7 | void main() { 8 | testWidgets('Default Swiper', (tester) async { 9 | // Build our app and trigger a frame. 10 | await tester.pumpWidget( 11 | MaterialApp( 12 | home: Swiper( 13 | itemBuilder: (context, index) { 14 | return const Text('0'); 15 | }, 16 | itemCount: 10, 17 | ), 18 | ), 19 | ); 20 | 21 | expect(find.text('0', skipOffstage: false), findsOneWidget); 22 | }); 23 | 24 | testWidgets('Default Swiper loop:false', (tester) async { 25 | // Build our app and trigger a frame. 26 | await tester.pumpWidget(MaterialApp( 27 | home: Swiper( 28 | onTap: (index) {}, 29 | itemBuilder: (context, index) { 30 | return const Text('0'); 31 | }, 32 | itemCount: 10, 33 | loop: false, 34 | ))); 35 | 36 | expect(find.text('0', skipOffstage: true), findsOneWidget); 37 | }); 38 | 39 | testWidgets('Create Swiper with children', (tester) async { 40 | // Build our app and trigger a frame. 41 | await tester.pumpWidget(MaterialApp( 42 | home: Swiper.children( 43 | children: const [ 44 | Text('0'), 45 | Text('1'), 46 | ], 47 | ))); 48 | 49 | expect(find.text('0', skipOffstage: false), findsOneWidget); 50 | }); 51 | 52 | testWidgets('Create Swiper with list', (tester) async { 53 | // Build our app and trigger a frame. 54 | await tester.pumpWidget(MaterialApp( 55 | home: Swiper.list( 56 | list: ['0', '1'], 57 | builder: (context, data, index) { 58 | return Text(data); 59 | }, 60 | ), 61 | )); 62 | 63 | expect(find.text('0', skipOffstage: false), findsOneWidget); 64 | }); 65 | 66 | testWidgets('Swiper with default plugins', (tester) async { 67 | // Build our app and trigger a frame. 68 | final controller = SwiperController(); 69 | await tester.pumpWidget(MaterialApp( 70 | home: Swiper( 71 | controller: controller, 72 | itemBuilder: (context, index) { 73 | return const Text('0'); 74 | }, 75 | itemCount: 10, 76 | pagination: const SwiperPagination(), 77 | control: const SwiperControl(), 78 | ), 79 | )); 80 | 81 | expect(find.text('0', skipOffstage: false), findsOneWidget); 82 | }); 83 | 84 | const titles = ['Flutter Swiper is awesome', 'Really nice', 'Yeah']; 85 | 86 | testWidgets('Customize pagination', (tester) async { 87 | // Build our app and trigger a frame. 88 | final controller = SwiperController(); 89 | await tester.pumpWidget( 90 | MaterialApp( 91 | home: Swiper( 92 | controller: controller, 93 | itemBuilder: (context, index) { 94 | return const Text('0'); 95 | }, 96 | itemCount: 10, 97 | pagination: SwiperCustomPagination( 98 | builder: (context, config) { 99 | return ConstrainedBox( 100 | constraints: const BoxConstraints.expand(height: 50.0), 101 | child: Row( 102 | children: [ 103 | Text( 104 | '${titles[config.activeIndex]} ${config.activeIndex + 1}/${config.itemCount}', 105 | style: const TextStyle(fontSize: 20.0), 106 | ), 107 | Expanded( 108 | child: Align( 109 | alignment: Alignment.centerRight, 110 | child: const DotSwiperPaginationBuilder( 111 | color: Colors.black12, 112 | activeColor: Colors.black, 113 | size: 10.0, 114 | activeSize: 20.0, 115 | ).build(context, config), 116 | ), 117 | ) 118 | ], 119 | ), 120 | ); 121 | }, 122 | ), 123 | control: const SwiperControl(), 124 | ), 125 | ), 126 | ); 127 | 128 | controller.startAutoplay(); 129 | 130 | controller.stopAutoplay(); 131 | 132 | await controller.move(0, animation: false); 133 | await controller.move(0, animation: false); 134 | 135 | await controller.next(animation: false); 136 | await controller.previous(animation: false); 137 | 138 | expect(find.text('0', skipOffstage: false), findsOneWidget); 139 | }); 140 | 141 | testWidgets('Swiper fraction', (tester) async { 142 | // Build our app and trigger a frame. 143 | final controller = SwiperController(); 144 | await tester.pumpWidget(MaterialApp( 145 | home: Swiper( 146 | controller: controller, 147 | itemBuilder: (context, index) { 148 | return const Text('0'); 149 | }, 150 | itemCount: 10, 151 | pagination: const SwiperPagination(builder: SwiperPagination.fraction), 152 | control: const SwiperControl(), 153 | ), 154 | )); 155 | 156 | expect(find.text('0', skipOffstage: false), findsOneWidget); 157 | }); 158 | 159 | testWidgets('Zero itemCount', (tester) async { 160 | // Build our app and trigger a frame. 161 | final controller = SwiperController(); 162 | await tester.pumpWidget(MaterialApp( 163 | home: Swiper( 164 | controller: controller, 165 | itemBuilder: (context, index) { 166 | return const Text('0'); 167 | }, 168 | itemCount: 0, 169 | pagination: const SwiperPagination(builder: SwiperPagination.fraction), 170 | control: const SwiperControl(), 171 | ))); 172 | 173 | expect(find.text('0', skipOffstage: false), findsNothing); 174 | }); 175 | } 176 | -------------------------------------------------------------------------------- /dev_lib/card_swiper/test/layout_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:card_swiper/card_swiper.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_test/flutter_test.dart'; 4 | 5 | void main() { 6 | testWidgets('STACK', (tester) async { 7 | await tester.pumpWidget( 8 | MaterialApp( 9 | home: Swiper( 10 | layout: SwiperLayout.STACK, 11 | itemWidth: 300.0, 12 | itemHeight: 200.0, 13 | itemBuilder: (context, index) { 14 | return ColoredBox( 15 | color: Colors.grey, 16 | child: Center( 17 | child: Text('$index'), 18 | ), 19 | ); 20 | }, 21 | itemCount: 10, 22 | ), 23 | ), 24 | ); 25 | }); 26 | 27 | testWidgets('TINDER', (tester) async { 28 | await tester.pumpWidget( 29 | MaterialApp( 30 | home: Swiper( 31 | layout: SwiperLayout.TINDER, 32 | itemWidth: 300.0, 33 | itemHeight: 200.0, 34 | itemBuilder: (context, index) { 35 | return ColoredBox( 36 | color: Colors.grey, 37 | child: Center( 38 | child: Text('$index'), 39 | ), 40 | ); 41 | }, 42 | itemCount: 10, 43 | ), 44 | ), 45 | ); 46 | }); 47 | 48 | testWidgets('DEFAULT', (tester) async { 49 | await tester.pumpWidget( 50 | MaterialApp( 51 | home: Swiper( 52 | layout: SwiperLayout.DEFAULT, 53 | viewportFraction: 0.8, 54 | scale: 0.9, 55 | itemBuilder: (context, index) { 56 | return ColoredBox( 57 | color: Colors.grey, 58 | child: Center( 59 | child: Text('$index'), 60 | ), 61 | ); 62 | }, 63 | itemCount: 10, 64 | ), 65 | ), 66 | ); 67 | }); 68 | 69 | testWidgets('CUSTOM', (tester) async { 70 | CustomLayoutOption customLayoutOption; 71 | customLayoutOption = CustomLayoutOption(startIndex: -1, stateCount: 3) 72 | ..addRotate([-45.0 / 180, 0.0, 45.0 / 180]) 73 | ..addTranslate( 74 | const [ 75 | Offset(-370.0, -40.0), 76 | Offset.zero, 77 | Offset(370.0, -40.0), 78 | ], 79 | ); 80 | await tester.pumpWidget( 81 | MaterialApp( 82 | home: Swiper( 83 | layout: SwiperLayout.CUSTOM, 84 | itemWidth: 300.0, 85 | itemHeight: 200.0, 86 | customLayoutOption: customLayoutOption, 87 | itemBuilder: (context, index) { 88 | return ColoredBox( 89 | color: Colors.grey, 90 | child: Center( 91 | child: Text('$index'), 92 | ), 93 | ); 94 | }, 95 | itemCount: 10, 96 | ), 97 | ), 98 | ); 99 | }); 100 | } 101 | -------------------------------------------------------------------------------- /dev_lib/card_swiper/test/pagination_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:card_swiper/card_swiper.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter_test/flutter_test.dart'; 4 | 5 | void main() { 6 | testWidgets('Pagination', (tester) async { 7 | final controller = SwiperController(); 8 | 9 | final config = SwiperPluginConfig( 10 | activeIndex: 0, 11 | controller: controller, 12 | itemCount: 10, 13 | scrollDirection: Axis.horizontal, 14 | ); 15 | 16 | final key = UniqueKey(); 17 | await tester.pumpWidget(MaterialApp( 18 | home: Scaffold(body: Builder(builder: (context) { 19 | return DotSwiperPaginationBuilder( 20 | key: key, 21 | activeColor: const Color(0xff000000), 22 | color: const Color(0xffffffff), 23 | space: 10.0, 24 | size: 10.0, 25 | activeSize: 20.0, 26 | ).build(context, config); 27 | })), 28 | )); 29 | 30 | for (var i = 0; i < 10; ++i) { 31 | expect(find.byWidgetPredicate((widget) { 32 | final key = widget.key; 33 | return key != null && key is ValueKey && key.value == 'pagination_$i'; 34 | }), findsOneWidget); 35 | } 36 | 37 | expect(find.byKey(key), findsOneWidget); 38 | }); 39 | 40 | testWidgets('Pagination vertical', (tester) async { 41 | final controller = SwiperController(); 42 | 43 | final config = SwiperPluginConfig( 44 | activeIndex: 0, 45 | controller: controller, 46 | itemCount: 10, 47 | scrollDirection: Axis.vertical, 48 | ); 49 | 50 | final key = UniqueKey(); 51 | await tester.pumpWidget(MaterialApp( 52 | home: Scaffold(body: Builder(builder: (context) { 53 | return DotSwiperPaginationBuilder( 54 | key: key, 55 | activeColor: const Color(0xff000000), 56 | color: const Color(0xffffffff), 57 | space: 10.0, 58 | size: 10.0, 59 | activeSize: 20.0) 60 | .build(context, config); 61 | })), 62 | )); 63 | 64 | for (var i = 0; i < 10; ++i) { 65 | expect(find.byWidgetPredicate((widget) { 66 | final key = widget.key; 67 | return key != null && key is ValueKey && key.value == 'pagination_$i'; 68 | }), findsOneWidget); 69 | } 70 | 71 | expect(find.byKey(key), findsOneWidget); 72 | }); 73 | 74 | testWidgets('Pagination fraction', (tester) async { 75 | final controller = SwiperController(); 76 | 77 | final config = SwiperPluginConfig( 78 | activeIndex: 0, 79 | controller: controller, 80 | itemCount: 10, 81 | scrollDirection: Axis.horizontal); 82 | 83 | final Key key = UniqueKey(); 84 | await tester.pumpWidget(MaterialApp( 85 | home: Scaffold(body: Builder(builder: (context) { 86 | return FractionPaginationBuilder( 87 | key: key, 88 | activeColor: const Color(0xff000000), 89 | color: const Color(0xffffffff), 90 | ).build(context, config); 91 | })), 92 | )); 93 | 94 | expect(find.text('1'), findsOneWidget); 95 | expect(find.text(' / 10'), findsOneWidget); 96 | 97 | expect(find.byKey(key), findsOneWidget); 98 | }); 99 | 100 | testWidgets('Pagination fraction vertical', (tester) async { 101 | final controller = SwiperController(); 102 | 103 | final config = SwiperPluginConfig( 104 | activeIndex: 0, 105 | controller: controller, 106 | itemCount: 10, 107 | scrollDirection: Axis.vertical, 108 | ); 109 | 110 | final Key key = UniqueKey(); 111 | await tester.pumpWidget(MaterialApp( 112 | home: Scaffold(body: Builder(builder: (context) { 113 | return FractionPaginationBuilder( 114 | key: key, 115 | activeColor: const Color(0xff000000), 116 | color: const Color(0xffffffff), 117 | ).build(context, config); 118 | })), 119 | )); 120 | 121 | expect(find.text('1'), findsOneWidget); 122 | expect(find.text('10'), findsOneWidget); 123 | 124 | expect(find.byKey(key), findsOneWidget); 125 | }); 126 | } 127 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | 11.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 43 | 49 | 50 | 51 | 52 | 53 | 63 | 65 | 71 | 72 | 73 | 74 | 80 | 82 | 88 | 89 | 90 | 91 | 93 | 94 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/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/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/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/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/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/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/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/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/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/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/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/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/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/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/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/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/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/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/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/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/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/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/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/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforany/montly_expenses_trackizer_app_flutter/858c10eb8cd0c52869d48c349074ddead23e46b5/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Trackizer 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | trackizer 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | $(FLUTTER_BUILD_NUMBER) 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | UIViewControllerBasedStatusBarAppearance 45 | 46 | CADisableMinimumFrameDurationOnPhone 47 | 48 | UIApplicationSupportsIndirectInputEvents 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /ios/RunnerTests/RunnerTests.swift: -------------------------------------------------------------------------------- 1 | import Flutter 2 | import UIKit 3 | import XCTest 4 | 5 | class RunnerTests: XCTestCase { 6 | 7 | func testExample() { 8 | // If you add code to the Runner application, consider adding tests here. 9 | // See https://developer.apple.com/documentation/xctest for more information about using XCTest. 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /lib/common/color_extension.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class TColor { 4 | static Color get primary => const Color(0xff5E00F5); 5 | static Color get primary500 => const Color(0xff7722FF ); 6 | static Color get primary20 => const Color(0xff924EFF); 7 | static Color get primary10 => const Color(0xffAD7BFF); 8 | static Color get primary5 => const Color(0xffC9A7FF); 9 | static Color get primary0 => const Color(0xffE4D3FF); 10 | 11 | static Color get secondary => const Color(0xffFF7966); 12 | static Color get secondary50 => const Color(0xffFFA699); 13 | static Color get secondary0 => const Color(0xffFFD2CC); 14 | 15 | static Color get secondaryG => const Color(0xff00FAD9); 16 | static Color get secondaryG50 => const Color(0xff7DFFEE); 17 | 18 | static Color get gray => const Color(0xff0E0E12); 19 | static Color get gray80 => const Color(0xff1C1C23); 20 | static Color get gray70 => const Color(0xff353542); 21 | static Color get gray60 => const Color(0xff4E4E61); 22 | static Color get gray50 => const Color(0xff666680); 23 | static Color get gray40 => const Color(0xff83839C); 24 | static Color get gray30 => const Color(0xffA2A2B5); 25 | static Color get gray20 => const Color(0xffC1C1CD); 26 | static Color get gray10 => const Color(0xffE0E0E6); 27 | 28 | static Color get border => const Color(0xffCFCFFC); 29 | static Color get primaryText => Colors.white; 30 | static Color get secondaryText => gray60; 31 | 32 | static Color get white => Colors.white; 33 | } 34 | -------------------------------------------------------------------------------- /lib/common_widget/budgets_row.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../common/color_extension.dart'; 4 | 5 | class BudgetsRow extends StatelessWidget { 6 | final Map bObj; 7 | final VoidCallback onPressed; 8 | 9 | const BudgetsRow({super.key, required this.bObj, required this.onPressed}); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | 14 | var proVal = (double.tryParse(bObj["left_amount"]) ?? 0) / (double.tryParse(bObj["total_budget"]) ?? 0); 15 | 16 | return Padding( 17 | padding: const EdgeInsets.only(bottom: 8), 18 | child: InkWell( 19 | borderRadius: BorderRadius.circular(16), 20 | onTap: onPressed, 21 | child: Container( 22 | 23 | padding: const EdgeInsets.all(10), 24 | decoration: BoxDecoration( 25 | border: Border.all( 26 | color: TColor.border.withOpacity(0.05), 27 | ), 28 | color: TColor.gray60.withOpacity(0.1), 29 | borderRadius: BorderRadius.circular(16), 30 | ), 31 | alignment: Alignment.center, 32 | child: Column( 33 | children: [ 34 | Row( 35 | mainAxisAlignment: MainAxisAlignment.center, 36 | crossAxisAlignment: CrossAxisAlignment.center, 37 | children: [ 38 | Padding( 39 | padding: const EdgeInsets.all(10.0), 40 | child: Image.asset( 41 | bObj["icon"], 42 | width: 30, 43 | height: 30, 44 | color: TColor.gray40, 45 | ), 46 | ), 47 | const SizedBox( 48 | width: 8, 49 | ), 50 | Expanded( 51 | child: Column( 52 | mainAxisAlignment: MainAxisAlignment.center, 53 | crossAxisAlignment: CrossAxisAlignment.start, 54 | children: [ 55 | Text( 56 | bObj["name"], 57 | style: TextStyle( 58 | color: TColor.white, 59 | fontSize: 14, 60 | fontWeight: FontWeight.w600), 61 | ), 62 | Text( 63 | "\$${bObj["left_amount"]} left to spend", 64 | style: TextStyle( 65 | color: TColor.gray30, 66 | fontSize: 12, 67 | fontWeight: FontWeight.w500), 68 | ), 69 | ], 70 | ), 71 | ), 72 | const SizedBox( 73 | width: 8, 74 | ), 75 | Column( 76 | mainAxisAlignment: MainAxisAlignment.center, 77 | crossAxisAlignment: CrossAxisAlignment.start, 78 | children: [ 79 | Text( 80 | "\$${bObj["spend_amount"]}", 81 | style: TextStyle( 82 | color: TColor.white, 83 | fontSize: 14, 84 | fontWeight: FontWeight.w600), 85 | ), 86 | Text( 87 | "of \$${bObj["total_budget"]}", 88 | style: TextStyle( 89 | color: TColor.gray30, 90 | fontSize: 12, 91 | fontWeight: FontWeight.w500), 92 | ), 93 | ]), 94 | ], 95 | ), 96 | 97 | const SizedBox(height: 8,), 98 | LinearProgressIndicator( 99 | backgroundColor: TColor.gray60, 100 | valueColor: AlwaysStoppedAnimation(bObj["color"]), 101 | minHeight: 3, 102 | value: proVal , 103 | ) 104 | ], 105 | ), 106 | ), 107 | ), 108 | ); 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /lib/common_widget/custom_arc_180_painter.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:vector_math/vector_math.dart'; 3 | import '../common/color_extension.dart'; 4 | 5 | 6 | class ArcValueModel { 7 | final Color color; 8 | final double value; 9 | 10 | ArcValueModel({required this.color, required this.value}); 11 | } 12 | 13 | class CustomArc180Painter extends CustomPainter { 14 | final double start; 15 | final double end; 16 | final double width; 17 | final double bgWidth; 18 | final double blurWidth; 19 | final double space; 20 | final List drwArcs; 21 | 22 | CustomArc180Painter( 23 | { required this.drwArcs, this.start = 0, this.end = 180, this.space = 5, this.width = 15, this.bgWidth = 10, this.blurWidth = 4}); 24 | 25 | @override 26 | void paint(Canvas canvas, Size size) { 27 | var rect = Rect.fromCircle( 28 | center: Offset(size.width / 2, size.height ), 29 | radius: size.width / 2); 30 | 31 | 32 | Paint backgroundPaint = Paint(); 33 | backgroundPaint.color = TColor.gray60.withOpacity(0.5); 34 | backgroundPaint.style = PaintingStyle.stroke; 35 | backgroundPaint.strokeWidth = bgWidth; 36 | backgroundPaint.strokeCap = StrokeCap.round; 37 | 38 | var startVal = 180.0 + start; 39 | var drawStart = startVal; 40 | canvas.drawArc( 41 | rect, radians(startVal), radians(180), false, backgroundPaint); 42 | 43 | for (var arcObj in drwArcs) { 44 | 45 | 46 | Paint activePaint = Paint(); 47 | activePaint.color = arcObj.color; 48 | activePaint.style = PaintingStyle.stroke; 49 | activePaint.strokeWidth = width; 50 | activePaint.strokeCap = StrokeCap.round; 51 | 52 | Paint shadowPaint = Paint() 53 | ..color = arcObj.color.withOpacity(0.3) 54 | ..style = PaintingStyle.stroke 55 | ..strokeWidth = width + blurWidth 56 | ..maskFilter = const MaskFilter.blur(BlurStyle.normal, 5); 57 | 58 | 59 | //Draw Shadow Arc 60 | Path path = Path(); 61 | path.addArc(rect, radians(drawStart), radians(arcObj.value - space )); 62 | canvas.drawPath(path, shadowPaint); 63 | 64 | canvas.drawArc(rect, radians(drawStart), radians(arcObj.value - space ), false, activePaint); 65 | 66 | drawStart = drawStart + arcObj.value + space; 67 | } 68 | 69 | 70 | } 71 | 72 | @override 73 | bool shouldRepaint(CustomArc180Painter oldDelegate) => false; 74 | 75 | @override 76 | bool shouldRebuildSemantics(CustomArc180Painter oldDelegate) => false; 77 | } 78 | -------------------------------------------------------------------------------- /lib/common_widget/custom_arc_painter.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:vector_math/vector_math.dart'; 3 | import '../common/color_extension.dart'; 4 | 5 | class CustomArcPainter extends CustomPainter { 6 | 7 | final double start; 8 | final double end; 9 | final double width; 10 | final double blurWidth; 11 | 12 | CustomArcPainter({this.start = 0, this.end = 270, this.width = 15, this.blurWidth = 6}); 13 | 14 | @override 15 | void paint(Canvas canvas, Size size) { 16 | var rect = Rect.fromCircle( 17 | center: Offset(size.width / 2, size.height / 2), 18 | radius: size.width / 2); 19 | 20 | var gradientColor = LinearGradient( 21 | colors: [TColor.secondary, TColor.secondary], 22 | begin: Alignment.topCenter, 23 | end: Alignment.bottomCenter); 24 | 25 | Paint activePaint = Paint()..shader = gradientColor.createShader(rect); 26 | 27 | activePaint.style = PaintingStyle.stroke; 28 | activePaint.strokeWidth = width; 29 | activePaint.strokeCap = StrokeCap.round; 30 | 31 | Paint backgroundPaint = Paint(); 32 | backgroundPaint.color = TColor.gray60.withOpacity(0.5); 33 | backgroundPaint.style = PaintingStyle.stroke; 34 | backgroundPaint.strokeWidth = width; 35 | backgroundPaint.strokeCap = StrokeCap.round; 36 | 37 | Paint shadowPaint = Paint() 38 | ..color = TColor.secondary.withOpacity(0.3) 39 | ..style = PaintingStyle.stroke 40 | ..strokeWidth = width + blurWidth 41 | ..maskFilter = const MaskFilter.blur(BlurStyle.normal, 5); 42 | 43 | var startVal = 135.0 + start; 44 | 45 | canvas.drawArc(rect, radians(startVal) , radians(270), false, backgroundPaint); 46 | 47 | //Draw Shadow Arc 48 | Path path = Path(); 49 | path.addArc(rect, radians(startVal) , radians(end)); 50 | canvas.drawPath(path, shadowPaint ); 51 | 52 | canvas.drawArc(rect, radians(startVal), radians(end), false, activePaint); 53 | } 54 | 55 | @override 56 | bool shouldRepaint(CustomArcPainter oldDelegate) => false; 57 | 58 | @override 59 | bool shouldRebuildSemantics(CustomArcPainter oldDelegate) => false; 60 | } 61 | -------------------------------------------------------------------------------- /lib/common_widget/icon_item_row.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | import '../common/color_extension.dart'; 5 | 6 | class IconItemRow extends StatelessWidget { 7 | final String title; 8 | final String icon; 9 | final String value; 10 | const IconItemRow( 11 | {super.key, 12 | required this.title, 13 | required this.icon, 14 | required this.value}); 15 | 16 | @override 17 | Widget build(BuildContext context) { 18 | return Padding( 19 | padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 8), 20 | child: Row( 21 | children: [ 22 | Image.asset( 23 | icon, 24 | width: 20, 25 | height: 20, 26 | color: TColor.gray20, 27 | ), 28 | const SizedBox( 29 | width: 15, 30 | ), 31 | Text( 32 | title, 33 | style: TextStyle( 34 | color: TColor.white, fontSize: 14, fontWeight: FontWeight.w600), 35 | ), 36 | Expanded( 37 | child: Text( 38 | value, 39 | textAlign: TextAlign.right, 40 | style: TextStyle( 41 | color: TColor.gray30, 42 | fontSize: 12, 43 | fontWeight: FontWeight.w500), 44 | ), 45 | ), 46 | const SizedBox( 47 | width: 8, 48 | ), 49 | Image.asset("assets/img/next.png", 50 | width: 12, height: 12, color: TColor.gray30) 51 | ], 52 | ), 53 | ); 54 | } 55 | } 56 | 57 | class IconItemSwitchRow extends StatelessWidget { 58 | final String title; 59 | final String icon; 60 | final bool value; 61 | final Function(bool) didChange; 62 | 63 | const IconItemSwitchRow( 64 | {super.key, 65 | required this.title, 66 | required this.icon, 67 | required this.didChange, 68 | required this.value}); 69 | 70 | @override 71 | Widget build(BuildContext context) { 72 | return Padding( 73 | padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 8), 74 | child: Row( 75 | children: [ 76 | Image.asset( 77 | icon, 78 | width: 20, 79 | height: 20, 80 | color: TColor.gray20, 81 | ), 82 | const SizedBox( 83 | width: 15, 84 | ), 85 | Text( 86 | title, 87 | style: TextStyle( 88 | color: TColor.white, fontSize: 14, fontWeight: FontWeight.w600), 89 | ), 90 | Spacer(), 91 | const SizedBox( 92 | width: 8, 93 | ), 94 | CupertinoSwitch(value: value, onChanged: didChange) 95 | ], 96 | ), 97 | ); 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /lib/common_widget/image_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../common/color_extension.dart'; 4 | 5 | class ImageButton extends StatelessWidget { 6 | final String image; 7 | final VoidCallback onPressed; 8 | const ImageButton({super.key, required this.image, required this.onPressed}); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return InkWell( 13 | borderRadius: BorderRadius.circular(16), 14 | onTap: onPressed, 15 | child: Container( 16 | width: 50, 17 | height: 50, 18 | decoration: BoxDecoration( 19 | border: Border.all( 20 | color: TColor.border.withOpacity(0.15), 21 | ), 22 | color: TColor.gray60.withOpacity(0.2), 23 | borderRadius: BorderRadius.circular(16), 24 | ), 25 | alignment: Alignment.center, 26 | child: Image.asset(image, width: 50, height: 50, color: TColor.gray70), 27 | ), 28 | ); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lib/common_widget/item_row.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../common/color_extension.dart'; 4 | 5 | class ItemRow extends StatelessWidget { 6 | final String title; 7 | final String value; 8 | const ItemRow({super.key, required this.title, required this.value}); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return Padding( 13 | padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), 14 | child: Row( 15 | children: [ 16 | Text( 17 | title, 18 | style: TextStyle( 19 | color: TColor.white, fontSize: 14, fontWeight: FontWeight.w600), 20 | ), 21 | Expanded( 22 | child: Text( 23 | value, 24 | textAlign: TextAlign.right, 25 | style: TextStyle( 26 | color: TColor.gray30, 27 | fontSize: 12, 28 | fontWeight: FontWeight.w500), 29 | ), 30 | ), 31 | const SizedBox( 32 | width: 8, 33 | ), 34 | Image.asset("assets/img/next.png", 35 | width: 12, height: 12, color: TColor.gray30) 36 | ], 37 | ), 38 | ); 39 | } 40 | } -------------------------------------------------------------------------------- /lib/common_widget/primary_button.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:flutter/material.dart'; 3 | 4 | import '../common/color_extension.dart'; 5 | 6 | class PrimaryButton extends StatelessWidget { 7 | final String title; 8 | final VoidCallback onPressed; 9 | final double fontSize; 10 | final FontWeight fontWeight; 11 | const PrimaryButton({super.key, required this.title, this.fontSize = 14, this.fontWeight = FontWeight.w600, required this.onPressed }); 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | return InkWell( 16 | onTap: onPressed, 17 | child: Container( 18 | height: 50, 19 | decoration: BoxDecoration( 20 | image: const DecorationImage( 21 | image: AssetImage("assets/img/primary_btn.png"), 22 | ), 23 | borderRadius: BorderRadius.circular(30), 24 | boxShadow: [ 25 | BoxShadow( 26 | color: TColor.secondary.withOpacity(0.25), 27 | blurRadius: 10, 28 | offset: const Offset(0, 4)) 29 | ]), 30 | alignment: Alignment.center, 31 | child: Text( 32 | title, 33 | style: TextStyle( 34 | color: TColor.white, fontSize: fontSize, fontWeight: fontWeight), 35 | ), 36 | ), 37 | ); 38 | } 39 | } 40 | 41 | 42 | -------------------------------------------------------------------------------- /lib/common_widget/round_textfield.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../common/color_extension.dart'; 4 | 5 | class RoundTextField extends StatelessWidget { 6 | final String title; 7 | final TextEditingController? controller; 8 | final TextInputType? keyboardType; 9 | final TextAlign titleAlign; 10 | final bool obscureText; 11 | const RoundTextField( 12 | {super.key, 13 | required this.title, 14 | this.titleAlign = TextAlign.left, 15 | this.controller, 16 | this.keyboardType, 17 | this.obscureText = false}); 18 | 19 | @override 20 | Widget build(BuildContext context) { 21 | return Column( 22 | crossAxisAlignment: CrossAxisAlignment.start, 23 | children: [ 24 | Row( 25 | children: [ 26 | Expanded( 27 | child: Text( 28 | title, 29 | textAlign: titleAlign, 30 | style: TextStyle(color: TColor.gray50, fontSize: 12), 31 | ), 32 | ) 33 | ], 34 | ), 35 | const SizedBox( 36 | height: 4, 37 | ), 38 | Container( 39 | height: 48, 40 | width: double.maxFinite, 41 | decoration: BoxDecoration( 42 | color: TColor.gray60.withOpacity(0.05), 43 | border: Border.all(color: TColor.gray70), 44 | borderRadius: BorderRadius.circular(15)), 45 | child: TextField( 46 | controller: controller, 47 | decoration: const InputDecoration( 48 | focusedBorder: InputBorder.none, 49 | errorBorder: InputBorder.none, 50 | enabledBorder: InputBorder.none, 51 | ), 52 | keyboardType: keyboardType, 53 | obscureText: obscureText, 54 | ), 55 | ) 56 | ], 57 | ); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /lib/common_widget/secondary_boutton.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../common/color_extension.dart'; 4 | 5 | class SecondaryButton extends StatelessWidget { 6 | final String title; 7 | final VoidCallback onPressed; 8 | final double fontSize; 9 | final FontWeight fontWeight; 10 | const SecondaryButton( 11 | {super.key, 12 | required this.title, 13 | this.fontSize = 14, 14 | this.fontWeight = FontWeight.w600, 15 | required this.onPressed}); 16 | 17 | @override 18 | Widget build(BuildContext context) { 19 | return InkWell( 20 | onTap: onPressed, 21 | child: Container( 22 | height: 50, 23 | decoration: BoxDecoration( 24 | image: const DecorationImage( 25 | image: AssetImage("assets/img/secodry_btn.png"), 26 | ), 27 | borderRadius: BorderRadius.circular(30), 28 | ), 29 | alignment: Alignment.center, 30 | child: Text( 31 | title, 32 | style: TextStyle( 33 | color: TColor.white, fontSize: fontSize, fontWeight: fontWeight), 34 | ), 35 | ), 36 | ); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /lib/common_widget/segment_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../common/color_extension.dart'; 4 | 5 | class SegmentButton extends StatelessWidget { 6 | final String title; 7 | final VoidCallback onPressed; 8 | final bool isActive; 9 | const SegmentButton( 10 | {super.key, 11 | required this.title, 12 | required this.isActive, 13 | required this.onPressed}); 14 | 15 | @override 16 | Widget build(BuildContext context) { 17 | return InkWell( 18 | borderRadius: BorderRadius.circular(12), 19 | onTap: onPressed, 20 | child: Container( 21 | decoration: isActive 22 | ? BoxDecoration( 23 | border: Border.all( 24 | color: TColor.border.withOpacity(0.15), 25 | ), 26 | color: TColor.gray60.withOpacity(0.2), 27 | borderRadius: BorderRadius.circular(12), 28 | ) 29 | : null, 30 | alignment: Alignment.center, 31 | child: Text( 32 | title, 33 | style: TextStyle( 34 | color: isActive ? TColor.white : TColor.gray30, 35 | fontSize: 12, 36 | fontWeight: FontWeight.w600), 37 | ), 38 | ), 39 | ); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /lib/common_widget/status_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../common/color_extension.dart'; 4 | 5 | class StatusButton extends StatelessWidget { 6 | final String title; 7 | final String value; 8 | final Color statusColor; 9 | 10 | final VoidCallback onPressed; 11 | const StatusButton( 12 | {super.key, 13 | required this.title, 14 | required this.value, 15 | required this.statusColor, 16 | required this.onPressed}); 17 | 18 | @override 19 | Widget build(BuildContext context) { 20 | return InkWell( 21 | onTap: onPressed, 22 | child: Stack( 23 | alignment: Alignment.topCenter, 24 | children: [ 25 | Container( 26 | height: 68, 27 | decoration: BoxDecoration( 28 | border: Border.all( 29 | color: TColor.border.withOpacity(0.15), 30 | ), 31 | color: TColor.gray60.withOpacity(0.2), 32 | borderRadius: BorderRadius.circular(16), 33 | ), 34 | alignment: Alignment.center, 35 | child: Column( 36 | mainAxisSize: MainAxisSize.min, 37 | children: [ 38 | Text( 39 | title, 40 | style: TextStyle( 41 | color: TColor.gray40, 42 | fontSize: 12, 43 | fontWeight: FontWeight.w600), 44 | ), 45 | Text( 46 | value, 47 | style: TextStyle( 48 | color: TColor.white, 49 | fontSize: 14, 50 | fontWeight: FontWeight.w600), 51 | ), 52 | ], 53 | ), 54 | ), 55 | Container( 56 | width: 60, 57 | height: 1, 58 | color: statusColor, 59 | ), 60 | ], 61 | ), 62 | ); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /lib/common_widget/subscription_cell.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../common/color_extension.dart'; 4 | 5 | class SubScriptionCell extends StatelessWidget { 6 | final Map sObj; 7 | final VoidCallback onPressed; 8 | 9 | const SubScriptionCell( 10 | {super.key, required this.sObj, required this.onPressed}); 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return InkWell( 15 | borderRadius: BorderRadius.circular(16), 16 | onTap: onPressed, 17 | child: Container( 18 | padding: const EdgeInsets.all(15), 19 | decoration: BoxDecoration( 20 | border: Border.all( 21 | color: TColor.border.withOpacity(0.1), 22 | ), 23 | color: TColor.gray60.withOpacity(0.2), 24 | borderRadius: BorderRadius.circular(16), 25 | ), 26 | alignment: Alignment.centerLeft, 27 | child: Column( 28 | crossAxisAlignment: CrossAxisAlignment.start, 29 | 30 | children: [ 31 | Image.asset( 32 | sObj["icon"], 33 | width: 45, 34 | height: 45, 35 | ), 36 | const Spacer(), 37 | Text( 38 | sObj["name"], 39 | style: TextStyle( 40 | color: TColor.white, 41 | fontSize: 14, 42 | fontWeight: FontWeight.w600), 43 | ), 44 | const SizedBox( 45 | width: 8, 46 | ), 47 | Text( 48 | "\$${sObj["price"]}", 49 | style: TextStyle( 50 | color: TColor.white, 51 | fontSize: 20, 52 | fontWeight: FontWeight.w700), 53 | ) 54 | ], 55 | ), 56 | ), 57 | ); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /lib/common_widget/subscription_home_row.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../common/color_extension.dart'; 4 | 5 | class SubScriptionHomeRow extends StatelessWidget { 6 | final Map sObj; 7 | final VoidCallback onPressed; 8 | 9 | const SubScriptionHomeRow( 10 | {super.key, required this.sObj, required this.onPressed}); 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return Padding( 15 | padding: const EdgeInsets.only(bottom: 8), 16 | child: InkWell( 17 | borderRadius: BorderRadius.circular(16), 18 | onTap: onPressed, 19 | child: Container( 20 | height: 64, 21 | padding: const EdgeInsets.all( 10), 22 | decoration: BoxDecoration( 23 | border: Border.all( 24 | color: TColor.border.withOpacity(0.15), 25 | ), 26 | 27 | borderRadius: BorderRadius.circular(16), 28 | ), 29 | alignment: Alignment.center, 30 | child: Row( 31 | children: [ 32 | 33 | 34 | Image.asset( 35 | sObj["icon"], 36 | width: 40, 37 | height: 40, 38 | ), 39 | const SizedBox( 40 | width: 8, 41 | ), 42 | Expanded( 43 | child: Text( 44 | sObj["name"], 45 | style: TextStyle( 46 | color: TColor.white, 47 | fontSize: 14, 48 | fontWeight: FontWeight.w600), 49 | ), 50 | ), 51 | const SizedBox( 52 | width: 8, 53 | ), 54 | Text( 55 | "\$${sObj["price"]}", 56 | style: TextStyle( 57 | color: TColor.white, 58 | fontSize: 14, 59 | fontWeight: FontWeight.w600), 60 | ) 61 | ], 62 | ), 63 | ), 64 | ), 65 | ); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /lib/common_widget/upcoming_bill_row.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../common/color_extension.dart'; 4 | 5 | class UpcomingBillRow extends StatelessWidget { 6 | final Map sObj; 7 | final VoidCallback onPressed; 8 | 9 | const UpcomingBillRow( 10 | {super.key, required this.sObj, required this.onPressed}); 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return Padding( 15 | padding: const EdgeInsets.only(bottom: 8), 16 | child: InkWell( 17 | borderRadius: BorderRadius.circular(16), 18 | onTap: onPressed, 19 | child: Container( 20 | height: 64, 21 | padding: const EdgeInsets.all(10), 22 | decoration: BoxDecoration( 23 | border: Border.all( 24 | color: TColor.border.withOpacity(0.15), 25 | ), 26 | borderRadius: BorderRadius.circular(16), 27 | ), 28 | alignment: Alignment.center, 29 | child: Row( 30 | children: [ 31 | Container( 32 | height: 40, 33 | width: 40, 34 | padding: const EdgeInsets.all(4), 35 | decoration: BoxDecoration( 36 | color: TColor.gray70.withOpacity(0.5), 37 | borderRadius: BorderRadius.circular(10), 38 | ), 39 | alignment: Alignment.center, 40 | child: Column( 41 | children: [ 42 | Text( 43 | "Jun", 44 | style: TextStyle( 45 | color: TColor.gray30, 46 | fontSize: 10, 47 | fontWeight: FontWeight.w500), 48 | ), 49 | 50 | Text( 51 | "25", 52 | style: TextStyle( 53 | color: TColor.gray30, 54 | fontSize: 14, 55 | fontWeight: FontWeight.w500), 56 | ) 57 | ], 58 | ), 59 | ), 60 | const SizedBox( 61 | width: 8, 62 | ), 63 | Expanded( 64 | child: Text( 65 | sObj["name"], 66 | style: TextStyle( 67 | color: TColor.white, 68 | fontSize: 14, 69 | fontWeight: FontWeight.w600), 70 | ), 71 | ), 72 | const SizedBox( 73 | width: 8, 74 | ), 75 | Text( 76 | "\$${sObj["price"]}", 77 | style: TextStyle( 78 | color: TColor.white, 79 | fontSize: 14, 80 | fontWeight: FontWeight.w600), 81 | ) 82 | ], 83 | ), 84 | ), 85 | ), 86 | ); 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:trackizer/common/color_extension.dart'; 3 | import 'package:trackizer/view/login/welcome_view.dart'; 4 | import 'package:trackizer/view/main_tab/main_tab_view.dart'; 5 | 6 | void main() { 7 | runApp(const MyApp()); 8 | } 9 | 10 | class MyApp extends StatelessWidget { 11 | const MyApp({super.key}); 12 | 13 | // This widget is the root of your application. 14 | @override 15 | Widget build(BuildContext context) { 16 | return MaterialApp( 17 | title: 'Trackizer', 18 | debugShowCheckedModeBanner: false, 19 | theme: ThemeData( 20 | fontFamily: "Inter", 21 | colorScheme: ColorScheme.fromSeed( 22 | seedColor: TColor.primary, 23 | background: TColor.gray80, 24 | primary: TColor.primary, 25 | primaryContainer: TColor.gray60, 26 | secondary: TColor.secondary, 27 | ), 28 | useMaterial3: false, 29 | ), 30 | home: const MainTabView(), 31 | ); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/view/add_subscription/add_subscription_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:carousel_slider/carousel_slider.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:trackizer/common/color_extension.dart'; 4 | import 'package:trackizer/common_widget/primary_button.dart'; 5 | import 'package:trackizer/common_widget/round_textfield.dart'; 6 | 7 | import '../../common_widget/image_button.dart'; 8 | 9 | class AddSubScriptionView extends StatefulWidget { 10 | const AddSubScriptionView({super.key}); 11 | 12 | @override 13 | State createState() => _AddSubScriptionViewState(); 14 | } 15 | 16 | class _AddSubScriptionViewState extends State { 17 | TextEditingController txtDescription = TextEditingController(); 18 | 19 | List subArr = [ 20 | {"name": "HBO GO", "icon": "assets/img/hbo_logo.png"}, 21 | {"name": "Spotify", "icon": "assets/img/spotify_logo.png"}, 22 | {"name": "YouTube Premium", "icon": "assets/img/youtube_logo.png"}, 23 | { 24 | "name": "Microsoft OneDrive", 25 | "icon": "assets/img/onedrive_logo.png", 26 | }, 27 | {"name": "NetFlix", "icon": "assets/img/netflix_logo.png"} 28 | ]; 29 | 30 | double amountVal = 0.09; 31 | 32 | @override 33 | Widget build(BuildContext context) { 34 | var media = MediaQuery.sizeOf(context); 35 | return Scaffold( 36 | backgroundColor: TColor.gray, 37 | body: SingleChildScrollView( 38 | child: Column( 39 | children: [ 40 | Container( 41 | decoration: BoxDecoration( 42 | color: TColor.gray70.withOpacity(0.5), 43 | borderRadius: const BorderRadius.only( 44 | bottomLeft: Radius.circular(25), 45 | bottomRight: Radius.circular(25))), 46 | child: SafeArea( 47 | child: Column( 48 | mainAxisAlignment: MainAxisAlignment.start, 49 | children: [ 50 | Stack( 51 | alignment: Alignment.center, 52 | children: [ 53 | Row( 54 | mainAxisAlignment: MainAxisAlignment.start, 55 | children: [ 56 | IconButton( 57 | onPressed: () { 58 | Navigator.pop(context); 59 | }, 60 | icon: Image.asset("assets/img/back.png", 61 | width: 25, 62 | height: 25, 63 | color: TColor.gray30)) 64 | ], 65 | ), 66 | Row( 67 | mainAxisAlignment: MainAxisAlignment.center, 68 | children: [ 69 | Text( 70 | "New", 71 | style: 72 | TextStyle(color: TColor.gray30, fontSize: 16), 73 | ) 74 | ], 75 | ), 76 | ], 77 | ), 78 | Padding( 79 | padding: const EdgeInsets.symmetric(vertical: 20), 80 | child: Text( 81 | "Add new\n subscription", 82 | textAlign: TextAlign.center, 83 | style: TextStyle( 84 | color: TColor.white, 85 | fontSize: 40, 86 | fontWeight: FontWeight.w700), 87 | ), 88 | ), 89 | SizedBox( 90 | width: media.width, 91 | height: media.width * 0.6, 92 | child: CarouselSlider.builder( 93 | options: CarouselOptions( 94 | autoPlay: false, 95 | aspectRatio: 1, 96 | enlargeCenterPage: true, 97 | enableInfiniteScroll: true, 98 | viewportFraction: 0.65, 99 | enlargeFactor: 0.4, 100 | enlargeStrategy: CenterPageEnlargeStrategy.zoom, 101 | ), 102 | itemCount: subArr.length, 103 | itemBuilder: (BuildContext context, int itemIndex, 104 | int pageViewIndex) { 105 | var sObj = subArr[itemIndex] as Map? ?? {}; 106 | 107 | return Container( 108 | margin: const EdgeInsets.all(10), 109 | child: Column( 110 | mainAxisAlignment: MainAxisAlignment.center, 111 | children: [ 112 | Image.asset( 113 | sObj["icon"], 114 | width: media.width * 0.4, 115 | height: media.width * 0.4, 116 | fit: BoxFit.fitHeight, 117 | ), 118 | const Spacer(), 119 | Text( 120 | sObj["name"], 121 | style: TextStyle( 122 | color: TColor.white, 123 | fontSize: 12, 124 | fontWeight: FontWeight.w600), 125 | ) 126 | ], 127 | ), 128 | ); 129 | }, 130 | ), 131 | ) 132 | ], 133 | ), 134 | ), 135 | ), 136 | 137 | Padding( 138 | padding: const EdgeInsets.only(top: 30, left: 20, right: 20), 139 | child: RoundTextField(title: "Description", titleAlign: TextAlign.center, controller: txtDescription, ) 140 | 141 | ), 142 | 143 | Padding( 144 | padding: const EdgeInsets.symmetric(vertical: 40, horizontal: 20), 145 | child: Row( 146 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 147 | children: [ 148 | ImageButton( 149 | image: "assets/img/minus.png", 150 | onPressed: () { 151 | 152 | amountVal -= 0.1; 153 | 154 | if(amountVal < 0) { 155 | amountVal = 0; 156 | } 157 | 158 | setState(() { 159 | 160 | }); 161 | }, 162 | ), 163 | 164 | Column( 165 | children: [ 166 | Text( 167 | "Monthly price", 168 | style: TextStyle( 169 | color: TColor.gray40, 170 | fontSize: 12, 171 | fontWeight: FontWeight.w600), 172 | ), 173 | 174 | const SizedBox(height: 4,), 175 | 176 | Text( 177 | "\$${amountVal.toStringAsFixed(2)}", 178 | style: TextStyle( 179 | color: TColor.white, 180 | fontSize: 40, 181 | fontWeight: FontWeight.w700), 182 | ), 183 | const SizedBox( 184 | height: 8, 185 | ), 186 | 187 | Container( 188 | width: 150, 189 | height: 1, 190 | color: TColor.gray70, 191 | ) 192 | ], 193 | ), 194 | 195 | ImageButton( 196 | image: "assets/img/plus.png", 197 | onPressed: () { 198 | amountVal += 0.1; 199 | 200 | setState(() {}); 201 | }, 202 | ) 203 | ], 204 | ), 205 | ), 206 | Padding( 207 | padding: const EdgeInsets.symmetric(horizontal: 20), 208 | child: 209 | PrimaryButton(title: "Add this platform", onPressed: () {}), 210 | ), 211 | const SizedBox( 212 | height: 20, 213 | ), 214 | ], 215 | ), 216 | ), 217 | ); 218 | } 219 | } 220 | -------------------------------------------------------------------------------- /lib/view/login/sign_in_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:trackizer/view/login/sign_up_view.dart'; 3 | 4 | import '../../common/color_extension.dart'; 5 | import '../../common_widget/primary_button.dart'; 6 | import '../../common_widget/round_textfield.dart'; 7 | import '../../common_widget/secondary_boutton.dart'; 8 | 9 | class SignInView extends StatefulWidget { 10 | const SignInView({super.key}); 11 | 12 | @override 13 | State createState() => _SignInViewState(); 14 | } 15 | 16 | class _SignInViewState extends State { 17 | TextEditingController txtEmail = TextEditingController(); 18 | TextEditingController txtPassword = TextEditingController(); 19 | bool isRemember = false; 20 | 21 | @override 22 | Widget build(BuildContext context) { 23 | var media = MediaQuery.sizeOf(context); 24 | return Scaffold( 25 | backgroundColor: TColor.gray, 26 | body: SafeArea( 27 | child: Padding( 28 | padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 20), 29 | child: Column( 30 | crossAxisAlignment: CrossAxisAlignment.center, 31 | children: [ 32 | Image.asset("assets/img/app_logo.png", 33 | width: media.width * 0.5, fit: BoxFit.contain), 34 | const Spacer(), 35 | RoundTextField( 36 | title: "Login", 37 | controller: txtEmail, 38 | keyboardType: TextInputType.emailAddress, 39 | ), 40 | const SizedBox( 41 | height: 15, 42 | ), 43 | RoundTextField( 44 | title: "Password", 45 | controller: txtPassword, 46 | obscureText: true, 47 | ), 48 | 49 | const SizedBox( 50 | height: 8, 51 | ), 52 | 53 | Row( 54 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 55 | children: [ 56 | TextButton( 57 | onPressed: () { 58 | setState(() { 59 | isRemember = !isRemember; 60 | }); 61 | }, 62 | child: Row( 63 | mainAxisSize: MainAxisSize.min, 64 | children: [ 65 | Icon( 66 | isRemember 67 | ? Icons.check_box_rounded 68 | : Icons.check_box_outline_blank_rounded, 69 | size: 25, 70 | color: TColor.gray50, 71 | ), 72 | const SizedBox( 73 | width: 8, 74 | ), 75 | Text( 76 | "Remember me", 77 | style: TextStyle(color: TColor.gray50, fontSize: 14), 78 | ), 79 | ], 80 | ), 81 | ), 82 | TextButton( 83 | onPressed: () {}, 84 | child: Text( 85 | "Forgot password", 86 | style: TextStyle(color: TColor.gray50, fontSize: 14), 87 | ), 88 | ), 89 | ], 90 | ), 91 | 92 | const SizedBox( 93 | height: 8, 94 | ), 95 | 96 | PrimaryButton( 97 | title: "Sign In", 98 | onPressed: () { 99 | // Navigator.push( 100 | // context, 101 | // MaterialPageRoute( 102 | // builder: (context) => const SocialLoginView(), 103 | // ), 104 | // ); 105 | }, 106 | ), 107 | const Spacer(), 108 | Text( 109 | "if you don't have an account yet?", 110 | textAlign: TextAlign.center, 111 | style: TextStyle(color: TColor.white, fontSize: 14), 112 | ), 113 | const SizedBox( 114 | height: 20, 115 | ), 116 | SecondaryButton( 117 | title: "Sign up", 118 | onPressed: () { 119 | Navigator.push( 120 | context, 121 | MaterialPageRoute( 122 | builder: (context) => const SignUpView(), 123 | ), 124 | ); 125 | }, 126 | ), 127 | ], 128 | ), 129 | ), 130 | ), 131 | ); 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /lib/view/login/sign_up_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:trackizer/view/login/sign_in_view.dart'; 3 | 4 | import '../../common/color_extension.dart'; 5 | import '../../common_widget/primary_button.dart'; 6 | import '../../common_widget/round_textfield.dart'; 7 | import '../../common_widget/secondary_boutton.dart'; 8 | 9 | class SignUpView extends StatefulWidget { 10 | const SignUpView({super.key}); 11 | 12 | @override 13 | State createState() => _SignUpViewState(); 14 | } 15 | 16 | class _SignUpViewState extends State { 17 | TextEditingController txtEmail = TextEditingController(); 18 | TextEditingController txtPassword = TextEditingController(); 19 | 20 | @override 21 | Widget build(BuildContext context) { 22 | var media = MediaQuery.sizeOf(context); 23 | return Scaffold( 24 | backgroundColor: TColor.gray, 25 | body: SafeArea( 26 | child: Padding( 27 | padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 20), 28 | child: Column( 29 | crossAxisAlignment: CrossAxisAlignment.center, 30 | children: [ 31 | Image.asset("assets/img/app_logo.png", 32 | width: media.width * 0.5, fit: BoxFit.contain), 33 | const Spacer(), 34 | RoundTextField( 35 | title: "E-mail address", 36 | controller: txtEmail, 37 | keyboardType: TextInputType.emailAddress, 38 | ), 39 | const SizedBox( 40 | height: 15, 41 | ), 42 | RoundTextField( 43 | title: "Password", 44 | controller: txtPassword, 45 | obscureText: true, 46 | ), 47 | const SizedBox( 48 | height: 20, 49 | ), 50 | Row( 51 | children: [ 52 | Expanded( 53 | child: Container( 54 | height: 5, 55 | margin: const EdgeInsets.symmetric(horizontal: 1), 56 | decoration: BoxDecoration( 57 | color: TColor.gray70, 58 | ), 59 | ), 60 | ), 61 | Expanded( 62 | child: Container( 63 | height: 5, 64 | margin: const EdgeInsets.symmetric(horizontal: 1), 65 | decoration: BoxDecoration( 66 | color: TColor.gray70, 67 | ), 68 | ), 69 | ), 70 | Expanded( 71 | child: Container( 72 | height: 5, 73 | margin: const EdgeInsets.symmetric(horizontal: 1), 74 | decoration: BoxDecoration( 75 | color: TColor.gray70, 76 | ), 77 | ), 78 | ), 79 | Expanded( 80 | child: Container( 81 | height: 5, 82 | margin: const EdgeInsets.symmetric(horizontal: 1), 83 | decoration: BoxDecoration( 84 | color: TColor.gray70, 85 | ), 86 | ), 87 | ) 88 | ], 89 | ), 90 | const SizedBox( 91 | height: 8, 92 | ), 93 | Row( 94 | mainAxisAlignment: MainAxisAlignment.start, 95 | children: [ 96 | Text( 97 | "Use 8 or more characters with a mix of letters,\nnumbers & symbols.", 98 | style: TextStyle(color: TColor.gray50, fontSize: 12), 99 | ), 100 | ], 101 | ), 102 | const SizedBox( 103 | height: 20, 104 | ), 105 | PrimaryButton( 106 | title: "Get started, it's free!", 107 | onPressed: () { 108 | // Navigator.push( 109 | // context, 110 | // MaterialPageRoute( 111 | // builder: (context) => const SocialLoginView(), 112 | // ), 113 | // ); 114 | }, 115 | ), 116 | const Spacer(), 117 | Text( 118 | "Do you have already an account?", 119 | textAlign: TextAlign.center, 120 | style: TextStyle(color: TColor.white, fontSize: 14), 121 | ), 122 | const SizedBox( 123 | height: 20, 124 | ), 125 | SecondaryButton( 126 | title: "Sign in", 127 | onPressed: () { 128 | Navigator.push( 129 | context, 130 | MaterialPageRoute( 131 | builder: (context) => const SignInView(), 132 | ), 133 | ); 134 | }, 135 | ), 136 | ], 137 | ), 138 | ), 139 | ), 140 | ); 141 | } 142 | } 143 | -------------------------------------------------------------------------------- /lib/view/login/social_login.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:trackizer/view/login/sign_up_view.dart'; 3 | 4 | import '../../common/color_extension.dart'; 5 | import '../../common_widget/secondary_boutton.dart'; 6 | 7 | class SocialLoginView extends StatefulWidget { 8 | const SocialLoginView({super.key}); 9 | 10 | @override 11 | State createState() => _SocialLoginViewState(); 12 | } 13 | 14 | class _SocialLoginViewState extends State { 15 | @override 16 | Widget build(BuildContext context) { 17 | var media = MediaQuery.sizeOf(context); 18 | return Scaffold( 19 | backgroundColor: TColor.gray, 20 | body: SafeArea( 21 | child: Padding( 22 | padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 20), 23 | child: Column( 24 | crossAxisAlignment: CrossAxisAlignment.center, 25 | children: [ 26 | Image.asset("assets/img/app_logo.png", 27 | width: media.width * 0.5, fit: BoxFit.contain), 28 | const Spacer(), 29 | InkWell( 30 | onTap: () {}, 31 | child: Container( 32 | height: 50, 33 | decoration: BoxDecoration( 34 | image: const DecorationImage( 35 | image: AssetImage("assets/img/apple_btn.png"), 36 | ), 37 | borderRadius: BorderRadius.circular(30), 38 | ), 39 | alignment: Alignment.center, 40 | child: Row( 41 | mainAxisAlignment: MainAxisAlignment.center, 42 | children: [ 43 | Image.asset( 44 | "assets/img/apple.png", 45 | width: 15, 46 | height: 15, 47 | ), 48 | const SizedBox( 49 | width: 8, 50 | ), 51 | Text( 52 | "Sign up with Apple", 53 | style: TextStyle( 54 | color: TColor.white, 55 | fontSize: 14, 56 | fontWeight: FontWeight.w600), 57 | ), 58 | ], 59 | ), 60 | ), 61 | ), 62 | const SizedBox( 63 | height: 15, 64 | ), 65 | InkWell( 66 | onTap: () {}, 67 | child: Container( 68 | height: 50, 69 | decoration: BoxDecoration( 70 | image: const DecorationImage( 71 | image: AssetImage("assets/img/google_btn.png"), 72 | ), 73 | borderRadius: BorderRadius.circular(30), 74 | boxShadow: [ 75 | BoxShadow( 76 | color: Colors.white.withOpacity(0.2), 77 | blurRadius: 8, 78 | offset: const Offset(0, 4)) 79 | ]), 80 | alignment: Alignment.center, 81 | child: Row( 82 | mainAxisAlignment: MainAxisAlignment.center, 83 | children: [ 84 | Image.asset( 85 | "assets/img/google.png", 86 | width: 15, 87 | height: 15, 88 | color: TColor.gray, 89 | ), 90 | const SizedBox( 91 | width: 8, 92 | ), 93 | Text( 94 | "Sign up with Google", 95 | style: TextStyle( 96 | color: TColor.gray, 97 | fontSize: 14, 98 | fontWeight: FontWeight.w600), 99 | ), 100 | ], 101 | ), 102 | ), 103 | ), 104 | const SizedBox( 105 | height: 15, 106 | ), 107 | InkWell( 108 | onTap: () {}, 109 | child: Container( 110 | height: 50, 111 | decoration: BoxDecoration( 112 | image: const DecorationImage( 113 | image: AssetImage("assets/img/fb_btn.png"), 114 | ), 115 | borderRadius: BorderRadius.circular(30), 116 | boxShadow: [ 117 | BoxShadow( 118 | color: Colors.blue.withOpacity(0.35), 119 | blurRadius: 8, 120 | offset: const Offset(0, 4)) 121 | ]), 122 | alignment: Alignment.center, 123 | child: Row( 124 | mainAxisAlignment: MainAxisAlignment.center, 125 | children: [ 126 | Image.asset( 127 | "assets/img/fb.png", 128 | width: 15, 129 | height: 15, 130 | ), 131 | const SizedBox( 132 | width: 8, 133 | ), 134 | Text( 135 | "Sign up with Facebook", 136 | style: TextStyle( 137 | color: TColor.white, 138 | fontSize: 14, 139 | fontWeight: FontWeight.w600), 140 | ), 141 | ], 142 | ), 143 | ), 144 | ), 145 | const SizedBox( 146 | height: 25, 147 | ), 148 | Text( 149 | "or", 150 | textAlign: TextAlign.center, 151 | style: TextStyle(color: TColor.white, fontSize: 14), 152 | ), 153 | const SizedBox( 154 | height: 25, 155 | ), 156 | SecondaryButton( 157 | title: "Sign up with E-mail", 158 | onPressed: () { 159 | Navigator.push( 160 | context, 161 | MaterialPageRoute( 162 | builder: (context) => const SignUpView())); 163 | }, 164 | ), 165 | const SizedBox( 166 | height: 20, 167 | ), 168 | Text( 169 | "By registering, you agree to our Terms of Use. Learn how we collect, use and share your data.", 170 | textAlign: TextAlign.center, 171 | style: TextStyle(color: TColor.white, fontSize: 14), 172 | ), 173 | ], 174 | ), 175 | ), 176 | ), 177 | ); 178 | } 179 | } 180 | -------------------------------------------------------------------------------- /lib/view/login/welcome_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter/services.dart'; 3 | import 'package:trackizer/view/login/sign_in_view.dart'; 4 | import 'package:trackizer/view/login/social_login.dart'; 5 | 6 | import '../../common/color_extension.dart'; 7 | import '../../common_widget/primary_button.dart'; 8 | import '../../common_widget/secondary_boutton.dart'; 9 | 10 | class WelcomeView extends StatefulWidget { 11 | const WelcomeView({super.key}); 12 | 13 | @override 14 | State createState() => _WelcomeViewState(); 15 | } 16 | 17 | class _WelcomeViewState extends State { 18 | @override 19 | void initState() { 20 | // TODO: implement initState 21 | super.initState(); 22 | SystemChrome.setEnabledSystemUIMode(SystemUiMode.leanBack); 23 | } 24 | 25 | @override 26 | Widget build(BuildContext context) { 27 | var media = MediaQuery.sizeOf(context); 28 | return Scaffold( 29 | backgroundColor: TColor.gray, 30 | body: Stack( 31 | alignment: Alignment.topCenter, 32 | children: [ 33 | Image.asset( 34 | "assets/img/welcome_screen.png", 35 | width: media.width, 36 | height: media.height, 37 | fit: BoxFit.cover, 38 | ), 39 | SafeArea( 40 | child: Padding( 41 | padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 20), 42 | child: Column( 43 | crossAxisAlignment: CrossAxisAlignment.center, 44 | children: [ 45 | Image.asset("assets/img/app_logo.png", 46 | width: media.width * 0.5, fit: BoxFit.contain), 47 | const Spacer(), 48 | Text( 49 | "Congue malesuada in ac justo, a tristique\nleo massa. Arcu leo leo urna risus.", 50 | textAlign: TextAlign.center, 51 | style: TextStyle(color: TColor.white, fontSize: 14), 52 | ), 53 | const SizedBox( 54 | height: 30, 55 | ), 56 | PrimaryButton( 57 | title: "Get started", 58 | onPressed: () { 59 | Navigator.push( 60 | context, 61 | MaterialPageRoute( 62 | builder: (context) => const SocialLoginView(), 63 | ), 64 | ); 65 | }, 66 | ), 67 | const SizedBox( 68 | height: 15, 69 | ), 70 | SecondaryButton( 71 | title: "I have an account", 72 | onPressed: () { 73 | Navigator.push( 74 | context, 75 | MaterialPageRoute( 76 | builder: (context) => const SignInView(), 77 | ), 78 | ); 79 | }, 80 | ), 81 | ], 82 | ), 83 | ), 84 | ) 85 | ], 86 | ), 87 | ); 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /lib/view/main_tab/main_tab_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter/services.dart'; 3 | import 'package:trackizer/view/add_subscription/add_subscription_view.dart'; 4 | 5 | import '../../common/color_extension.dart'; 6 | import '../calender/calender_view.dart'; 7 | import '../card/cards_view.dart'; 8 | import '../home/home_view.dart'; 9 | import '../spending_budgets/spending_budgets_view.dart'; 10 | 11 | class MainTabView extends StatefulWidget { 12 | const MainTabView({super.key}); 13 | 14 | @override 15 | State createState() => _MainTabViewState(); 16 | } 17 | 18 | class _MainTabViewState extends State { 19 | int selectTab = 0; 20 | PageStorageBucket pageStorageBucket = PageStorageBucket(); 21 | Widget currentTabView = const HomeView(); 22 | 23 | @override 24 | void initState() { 25 | // TODO: implement initState 26 | super.initState(); 27 | SystemChrome.setEnabledSystemUIMode(SystemUiMode.leanBack); 28 | } 29 | 30 | @override 31 | Widget build(BuildContext context) { 32 | return Scaffold( 33 | backgroundColor: TColor.gray, 34 | body: Stack(children: [ 35 | PageStorage(bucket: pageStorageBucket, child: currentTabView), 36 | SafeArea( 37 | child: Column( 38 | children: [ 39 | const Spacer(), 40 | Padding( 41 | padding: 42 | const EdgeInsets.symmetric(vertical: 8, horizontal: 20), 43 | child: Stack( 44 | alignment: Alignment.bottomCenter, 45 | children: [ 46 | Stack( 47 | alignment: Alignment.center, 48 | children: [ 49 | Image.asset("assets/img/bottom_bar_bg.png"), 50 | Row( 51 | mainAxisAlignment: MainAxisAlignment.spaceAround, 52 | children: [ 53 | IconButton( 54 | onPressed: () { 55 | setState(() { 56 | selectTab = 0; 57 | currentTabView = const HomeView(); 58 | }); 59 | }, 60 | icon: Image.asset( 61 | "assets/img/home.png", 62 | width: 20, 63 | height: 20, 64 | color: selectTab == 0 65 | ? TColor.white 66 | : TColor.gray30, 67 | ), 68 | ), 69 | IconButton( 70 | onPressed: () { 71 | setState(() { 72 | selectTab = 1; 73 | currentTabView = const SpendingBudgetsView(); 74 | }); 75 | }, 76 | icon: Image.asset( 77 | "assets/img/budgets.png", 78 | width: 20, 79 | height: 20, 80 | color: selectTab == 1 81 | ? TColor.white 82 | : TColor.gray30, 83 | ), 84 | ), 85 | const SizedBox( 86 | width: 50, 87 | height: 50, 88 | ), 89 | IconButton( 90 | onPressed: () { 91 | setState(() { 92 | selectTab = 2; 93 | currentTabView = CalenderView(); 94 | }); 95 | }, 96 | icon: Image.asset( 97 | "assets/img/calendar.png", 98 | width: 20, 99 | height: 20, 100 | color: selectTab == 2 101 | ? TColor.white 102 | : TColor.gray30, 103 | ), 104 | ), 105 | IconButton( 106 | onPressed: () { 107 | setState(() { 108 | selectTab = 3; 109 | currentTabView = CardsView(); 110 | }); 111 | }, 112 | icon: Image.asset( 113 | "assets/img/creditcards.png", 114 | width: 20, 115 | height: 20, 116 | color: selectTab == 3 117 | ? TColor.white 118 | : TColor.gray30, 119 | ), 120 | ), 121 | ], 122 | ) 123 | ], 124 | ), 125 | InkWell( 126 | onTap: () { 127 | Navigator.push(context, MaterialPageRoute(builder: (context) => const AddSubScriptionView()) ); 128 | }, 129 | child: Container( 130 | margin: const EdgeInsets.all(20), 131 | decoration: BoxDecoration(boxShadow: [ 132 | BoxShadow( 133 | color: TColor.secondary.withOpacity(0.25), 134 | blurRadius: 10, 135 | offset: const Offset(0, 4)) 136 | ], borderRadius: BorderRadius.circular(50)), 137 | child: Image.asset( 138 | "assets/img/center_btn.png", 139 | width: 55, 140 | height: 55, 141 | ), 142 | ), 143 | ) 144 | ], 145 | ), 146 | ) 147 | ], 148 | ), 149 | ) 150 | ]), 151 | ); 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /lib/view/spending_budgets/spending_budgets_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:dotted_border/dotted_border.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:trackizer/common/color_extension.dart'; 4 | import 'package:trackizer/common_widget/budgets_row.dart'; 5 | import 'package:trackizer/common_widget/custom_arc_180_painter.dart'; 6 | 7 | import '../settings/settings_view.dart'; 8 | 9 | class SpendingBudgetsView extends StatefulWidget { 10 | const SpendingBudgetsView({super.key}); 11 | 12 | @override 13 | State createState() => _SpendingBudgetsViewState(); 14 | } 15 | 16 | class _SpendingBudgetsViewState extends State { 17 | List budgetArr = [ 18 | { 19 | "name": "Auto & Transport", 20 | "icon": "assets/img/auto_&_transport.png", 21 | "spend_amount": "25.99", 22 | "total_budget": "400", 23 | "left_amount": "250.01", 24 | "color": TColor.secondaryG 25 | }, 26 | { 27 | "name": "Entertainment", 28 | "icon": "assets/img/entertainment.png", 29 | "spend_amount": "50.99", 30 | "total_budget": "600", 31 | "left_amount": "300.01", 32 | "color": TColor.secondary50 33 | }, 34 | { 35 | "name": "Security", 36 | "icon": "assets/img/security.png", 37 | "spend_amount": "5.99", 38 | "total_budget": "600", 39 | "left_amount": "250.01", 40 | "color": TColor.primary10 41 | }, 42 | ]; 43 | 44 | @override 45 | Widget build(BuildContext context) { 46 | var media = MediaQuery.sizeOf(context); 47 | return Scaffold( 48 | backgroundColor: TColor.gray, 49 | body: SingleChildScrollView( 50 | child: Column( 51 | children: [ 52 | Padding( 53 | padding: const EdgeInsets.only(top: 35, right: 10), 54 | child: Row( 55 | children: [ 56 | Spacer(), 57 | IconButton( 58 | onPressed: () { 59 | Navigator.push( 60 | context, 61 | MaterialPageRoute( 62 | builder: (context) => const SettingsView())); 63 | }, 64 | icon: Image.asset("assets/img/settings.png", 65 | width: 25, height: 25, color: TColor.gray30)) 66 | ], 67 | ), 68 | ), 69 | Stack( 70 | alignment: Alignment.bottomCenter, 71 | children: [ 72 | Container( 73 | width: media.width * 0.5, 74 | height: media.width * 0.30, 75 | child: CustomPaint( 76 | painter: CustomArc180Painter( 77 | drwArcs: [ 78 | ArcValueModel(color: TColor.secondaryG, value: 20), 79 | ArcValueModel(color: TColor.secondary, value: 45), 80 | ArcValueModel(color: TColor.primary10, value: 70), 81 | ], 82 | end: 50, 83 | width: 12, 84 | bgWidth: 8, 85 | ), 86 | ), 87 | ), 88 | Column( 89 | children: [ 90 | Text( 91 | "\$82,90", 92 | style: TextStyle( 93 | color: TColor.white, 94 | fontSize: 24, 95 | fontWeight: FontWeight.w700), 96 | ), 97 | Text( 98 | "of \$2,0000 budget", 99 | style: TextStyle( 100 | color: TColor.gray30, 101 | fontSize: 12, 102 | fontWeight: FontWeight.w500), 103 | ), 104 | ], 105 | ) 106 | ], 107 | ), 108 | const SizedBox( 109 | height: 40, 110 | ), 111 | Padding( 112 | padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 8), 113 | child: InkWell( 114 | borderRadius: BorderRadius.circular(16), 115 | onTap: () {}, 116 | child: Container( 117 | height: 64, 118 | padding: const EdgeInsets.all(10), 119 | decoration: BoxDecoration( 120 | border: Border.all( 121 | color: TColor.border.withOpacity(0.1), 122 | ), 123 | borderRadius: BorderRadius.circular(16), 124 | ), 125 | alignment: Alignment.center, 126 | child: Row( 127 | mainAxisAlignment: MainAxisAlignment.center, 128 | children: [ 129 | Text( 130 | "Your budgets are on tack 👍", 131 | style: TextStyle( 132 | color: TColor.white, 133 | fontSize: 14, 134 | fontWeight: FontWeight.w600), 135 | ), 136 | ], 137 | ), 138 | ), 139 | ), 140 | ), 141 | ListView.builder( 142 | padding: 143 | const EdgeInsets.symmetric(horizontal: 20, vertical: 8), 144 | physics: const NeverScrollableScrollPhysics(), 145 | shrinkWrap: true, 146 | itemCount: budgetArr.length, 147 | itemBuilder: (context, index) { 148 | var bObj = budgetArr[index] as Map? ?? {}; 149 | 150 | return BudgetsRow( 151 | bObj: bObj, 152 | onPressed: () {}, 153 | ); 154 | }), 155 | Padding( 156 | padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 0), 157 | child: InkWell( 158 | borderRadius: BorderRadius.circular(16), 159 | onTap: () {}, 160 | child: DottedBorder( 161 | dashPattern: const [5, 4], 162 | strokeWidth: 1, 163 | borderType: BorderType.RRect, 164 | radius: const Radius.circular(16), 165 | color: TColor.border.withOpacity(0.1), 166 | child: Container( 167 | height: 64, 168 | padding: const EdgeInsets.all(10), 169 | decoration: BoxDecoration( 170 | borderRadius: BorderRadius.circular(16), 171 | ), 172 | alignment: Alignment.center, 173 | child: Row( 174 | mainAxisAlignment: MainAxisAlignment.center, 175 | children: [ 176 | Text( 177 | "Add new category ", 178 | style: TextStyle( 179 | color: TColor.gray30, 180 | fontSize: 14, 181 | fontWeight: FontWeight.w600), 182 | ), 183 | Image.asset( 184 | "assets/img/add.png", 185 | width: 12, 186 | height: 12, 187 | color: TColor.gray30, 188 | ) 189 | ], 190 | ), 191 | ), 192 | ), 193 | ), 194 | ), 195 | const SizedBox( 196 | height: 110, 197 | ), 198 | ], 199 | ), 200 | ), 201 | ); 202 | } 203 | } 204 | -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "2.11.0" 12 | boolean_selector: 13 | dependency: transitive 14 | description: 15 | name: boolean_selector 16 | sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" 17 | url: "https://pub.dev" 18 | source: hosted 19 | version: "2.1.1" 20 | calendar_agenda: 21 | dependency: "direct main" 22 | description: 23 | path: "dev_lib/calendar_agenda" 24 | relative: true 25 | source: path 26 | version: "0.0.2+2" 27 | card_swiper: 28 | dependency: "direct main" 29 | description: 30 | path: "dev_lib/card_swiper" 31 | relative: true 32 | source: path 33 | version: "3.0.1" 34 | carousel_slider: 35 | dependency: "direct main" 36 | description: 37 | name: carousel_slider 38 | sha256: "9c695cc963bf1d04a47bd6021f68befce8970bcd61d24938e1fb0918cf5d9c42" 39 | url: "https://pub.dev" 40 | source: hosted 41 | version: "4.2.1" 42 | characters: 43 | dependency: transitive 44 | description: 45 | name: characters 46 | sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" 47 | url: "https://pub.dev" 48 | source: hosted 49 | version: "1.3.0" 50 | clock: 51 | dependency: transitive 52 | description: 53 | name: clock 54 | sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf 55 | url: "https://pub.dev" 56 | source: hosted 57 | version: "1.1.1" 58 | collection: 59 | dependency: transitive 60 | description: 61 | name: collection 62 | sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" 63 | url: "https://pub.dev" 64 | source: hosted 65 | version: "1.17.1" 66 | cupertino_icons: 67 | dependency: "direct main" 68 | description: 69 | name: cupertino_icons 70 | sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be 71 | url: "https://pub.dev" 72 | source: hosted 73 | version: "1.0.5" 74 | dotted_border: 75 | dependency: "direct main" 76 | description: 77 | name: dotted_border 78 | sha256: "07a5c5e8d4e6e992279e190e0352be8faa5b8f96d81c77a78b2d42f060279840" 79 | url: "https://pub.dev" 80 | source: hosted 81 | version: "2.0.0+3" 82 | fake_async: 83 | dependency: transitive 84 | description: 85 | name: fake_async 86 | sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" 87 | url: "https://pub.dev" 88 | source: hosted 89 | version: "1.3.1" 90 | flutter: 91 | dependency: "direct main" 92 | description: flutter 93 | source: sdk 94 | version: "0.0.0" 95 | flutter_lints: 96 | dependency: "direct dev" 97 | description: 98 | name: flutter_lints 99 | sha256: "2118df84ef0c3ca93f96123a616ae8540879991b8b57af2f81b76a7ada49b2a4" 100 | url: "https://pub.dev" 101 | source: hosted 102 | version: "2.0.2" 103 | flutter_test: 104 | dependency: "direct dev" 105 | description: flutter 106 | source: sdk 107 | version: "0.0.0" 108 | intl: 109 | dependency: "direct main" 110 | description: 111 | name: intl 112 | sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" 113 | url: "https://pub.dev" 114 | source: hosted 115 | version: "0.18.1" 116 | js: 117 | dependency: transitive 118 | description: 119 | name: js 120 | sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 121 | url: "https://pub.dev" 122 | source: hosted 123 | version: "0.6.7" 124 | lints: 125 | dependency: transitive 126 | description: 127 | name: lints 128 | sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" 129 | url: "https://pub.dev" 130 | source: hosted 131 | version: "2.1.1" 132 | matcher: 133 | dependency: transitive 134 | description: 135 | name: matcher 136 | sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" 137 | url: "https://pub.dev" 138 | source: hosted 139 | version: "0.12.15" 140 | material_color_utilities: 141 | dependency: transitive 142 | description: 143 | name: material_color_utilities 144 | sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 145 | url: "https://pub.dev" 146 | source: hosted 147 | version: "0.2.0" 148 | meta: 149 | dependency: transitive 150 | description: 151 | name: meta 152 | sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" 153 | url: "https://pub.dev" 154 | source: hosted 155 | version: "1.9.1" 156 | path: 157 | dependency: transitive 158 | description: 159 | name: path 160 | sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" 161 | url: "https://pub.dev" 162 | source: hosted 163 | version: "1.8.3" 164 | path_drawing: 165 | dependency: transitive 166 | description: 167 | name: path_drawing 168 | sha256: bbb1934c0cbb03091af082a6389ca2080345291ef07a5fa6d6e078ba8682f977 169 | url: "https://pub.dev" 170 | source: hosted 171 | version: "1.0.1" 172 | path_parsing: 173 | dependency: transitive 174 | description: 175 | name: path_parsing 176 | sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf 177 | url: "https://pub.dev" 178 | source: hosted 179 | version: "1.0.1" 180 | scrollable_positioned_list: 181 | dependency: transitive 182 | description: 183 | name: scrollable_positioned_list 184 | sha256: "1b54d5f1329a1e263269abc9e2543d90806131aa14fe7c6062a8054d57249287" 185 | url: "https://pub.dev" 186 | source: hosted 187 | version: "0.3.8" 188 | sky_engine: 189 | dependency: transitive 190 | description: flutter 191 | source: sdk 192 | version: "0.0.99" 193 | source_span: 194 | dependency: transitive 195 | description: 196 | name: source_span 197 | sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 198 | url: "https://pub.dev" 199 | source: hosted 200 | version: "1.9.1" 201 | stack_trace: 202 | dependency: transitive 203 | description: 204 | name: stack_trace 205 | sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 206 | url: "https://pub.dev" 207 | source: hosted 208 | version: "1.11.0" 209 | stream_channel: 210 | dependency: transitive 211 | description: 212 | name: stream_channel 213 | sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" 214 | url: "https://pub.dev" 215 | source: hosted 216 | version: "2.1.1" 217 | string_scanner: 218 | dependency: transitive 219 | description: 220 | name: string_scanner 221 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" 222 | url: "https://pub.dev" 223 | source: hosted 224 | version: "1.2.0" 225 | term_glyph: 226 | dependency: transitive 227 | description: 228 | name: term_glyph 229 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 230 | url: "https://pub.dev" 231 | source: hosted 232 | version: "1.2.1" 233 | test_api: 234 | dependency: transitive 235 | description: 236 | name: test_api 237 | sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb 238 | url: "https://pub.dev" 239 | source: hosted 240 | version: "0.5.1" 241 | vector_math: 242 | dependency: transitive 243 | description: 244 | name: vector_math 245 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" 246 | url: "https://pub.dev" 247 | source: hosted 248 | version: "2.1.4" 249 | sdks: 250 | dart: ">=3.0.5 <4.0.0" 251 | flutter: ">=2.12.0" 252 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: trackizer 2 | description: A new Flutter project. 3 | # The following line prevents the package from being accidentally published to 4 | # pub.dev using `flutter pub publish`. This is preferred for private packages. 5 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 6 | 7 | # The following defines the version and build number for your application. 8 | # A version number is three numbers separated by dots, like 1.2.43 9 | # followed by an optional build number separated by a +. 10 | # Both the version and the builder number may be overridden in flutter 11 | # build by specifying --build-name and --build-number, respectively. 12 | # In Android, build-name is used as versionName while build-number used as versionCode. 13 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 14 | # In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. 15 | # Read more about iOS versioning at 16 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 17 | # In Windows, build-name is used as the major, minor, and patch parts 18 | # of the product and file versions while build-number is used as the build suffix. 19 | version: 1.0.0+1 20 | 21 | environment: 22 | sdk: '>=3.0.5 <4.0.0' 23 | 24 | # Dependencies specify other packages that your package needs in order to work. 25 | # To automatically upgrade your package dependencies to the latest versions 26 | # consider running `flutter pub upgrade --major-versions`. Alternatively, 27 | # dependencies can be manually updated by changing the version numbers below to 28 | # the latest version available on pub.dev. To see which dependencies have newer 29 | # versions available, run `flutter pub outdated`. 30 | dependencies: 31 | flutter: 32 | sdk: flutter 33 | 34 | 35 | # The following adds the Cupertino Icons font to your application. 36 | # Use with the CupertinoIcons class for iOS style icons. 37 | cupertino_icons: ^1.0.2 38 | dotted_border: ^2.0.0+3 39 | intl: ^0.18.0 40 | calendar_agenda: 41 | path: dev_lib/calendar_agenda 42 | carousel_slider: ^4.2.1 43 | card_swiper: 44 | path: dev_lib/card_swiper 45 | 46 | dev_dependencies: 47 | flutter_test: 48 | sdk: flutter 49 | 50 | # The "flutter_lints" package below contains a set of recommended lints to 51 | # encourage good coding practices. The lint set provided by the package is 52 | # activated in the `analysis_options.yaml` file located at the root of your 53 | # package. See that file for information about deactivating specific lint 54 | # rules and activating additional ones. 55 | flutter_lints: ^2.0.0 56 | 57 | # For information on the generic Dart part of this file, see the 58 | # following page: https://dart.dev/tools/pub/pubspec 59 | 60 | # The following section is specific to Flutter packages. 61 | flutter: 62 | 63 | # The following line ensures that the Material Icons font is 64 | # included with your application, so that you can use the icons in 65 | # the material Icons class. 66 | uses-material-design: true 67 | 68 | # To add assets to your application, add an assets section, like this: 69 | assets: 70 | - assets/img/ 71 | 72 | # An image asset can refer to one or more resolution-specific "variants", see 73 | # https://flutter.dev/assets-and-images/#resolution-aware 74 | 75 | # For details regarding adding assets from package dependencies, see 76 | # https://flutter.dev/assets-and-images/#from-packages 77 | 78 | # To add custom fonts to your application, add a fonts section here, 79 | # in this "flutter" section. Each entry in this list should have a 80 | # "family" key with the font family name, and a "fonts" key with a 81 | # list giving the asset and other descriptors for the font. For 82 | # example: 83 | fonts: 84 | - family: Inter 85 | fonts: 86 | - asset: assets/font/Inter-Regular.ttf 87 | - asset: assets/font/Inter-Medium.ttf 88 | weight: 500 89 | - asset: assets/font/Inter-SemiBold.ttf 90 | weight: 600 91 | - asset: assets/font/Inter-Bold.ttf 92 | weight: 700 93 | # 94 | # For details regarding fonts from package dependencies, 95 | # see https://flutter.dev/custom-fonts/#from-packages 96 | --------------------------------------------------------------------------------