├── .gitignore ├── .metadata ├── README.md ├── analysis_options.yaml ├── android ├── .gitignore ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── money_management_app_ui_2 │ │ │ │ └── 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 ├── ios ├── Flutter │ ├── Generated.xcconfig │ └── flutter_export_environment.sh └── Runner │ ├── GeneratedPluginRegistrant.h │ └── GeneratedPluginRegistrant.m ├── lib ├── main.dart ├── pages │ ├── dash_board_page.dart │ └── home_page.dart ├── styles │ └── color_schema.dart ├── utils │ └── custom_shape_clipper.dart └── widgets │ ├── cards_options_widget.dart │ └── up_coming_card_widget.dart ├── pubspec.lock ├── pubspec.yaml └── test └── widget_test.dart /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 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: e599f02c7af4aa8aba0e8e96f71c737f85be3c6e 8 | channel: beta 9 | 10 | project_type: app 11 | 12 | # Tracks metadata for the flutter migrate command 13 | migration: 14 | platforms: 15 | - platform: root 16 | create_revision: e599f02c7af4aa8aba0e8e96f71c737f85be3c6e 17 | base_revision: e599f02c7af4aa8aba0e8e96f71c737f85be3c6e 18 | - platform: android 19 | create_revision: e599f02c7af4aa8aba0e8e96f71c737f85be3c6e 20 | base_revision: e599f02c7af4aa8aba0e8e96f71c737f85be3c6e 21 | 22 | # User provided section 23 | 24 | # List of Local paths (relative to this file) that should be 25 | # ignored by the migrate tool. 26 | # 27 | # Files that are not part of the templates will be ignored by default. 28 | unmanaged_files: 29 | - 'lib/main.dart' 30 | - 'ios/Runner.xcodeproj/project.pbxproj' 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Money Management App UI 2 | ## Screenshots 3 | ![Home UI](https://i.ibb.co/TmK6VWn/Screenshot-1562013271.png) 4 | ![Dashboard UI](https://i.ibb.co/xYGbRpL/Screenshot-1562013278.png) 5 | 6 | ## YouTube SpeedCode 7 | A new Flutter project. Created for the videos on my channel. 8 | - Part 01: https://youtu.be/7EW5-Ov2-ys 9 | - Part 02: https://youtu.be/4-T15YEvfMQ 10 | 11 | ## Getting Started 12 | 13 | This project is a starting point for a Flutter application. 14 | 15 | A few resources to get you started if this is your first Flutter project: 16 | 17 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) 18 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) 19 | 20 | For help getting started with Flutter, view our 21 | [online documentation](https://flutter.dev/docs), which offers tutorials, 22 | samples, guidance on mobile development, and a full API reference. -------------------------------------------------------------------------------- /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 | compileSdkVersion flutter.compileSdkVersion 30 | ndkVersion flutter.ndkVersion 31 | 32 | compileOptions { 33 | sourceCompatibility JavaVersion.VERSION_1_8 34 | targetCompatibility JavaVersion.VERSION_1_8 35 | } 36 | 37 | kotlinOptions { 38 | jvmTarget = '1.8' 39 | } 40 | 41 | sourceSets { 42 | main.java.srcDirs += 'src/main/kotlin' 43 | } 44 | 45 | defaultConfig { 46 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 47 | applicationId "com.example.money_management_app_ui_2" 48 | // You can update the following values to match your application needs. 49 | // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. 50 | minSdkVersion flutter.minSdkVersion 51 | targetSdkVersion flutter.targetSdkVersion 52 | versionCode flutterVersionCode.toInteger() 53 | versionName flutterVersionName 54 | } 55 | 56 | buildTypes { 57 | release { 58 | // TODO: Add your own signing config for the release build. 59 | // Signing with the debug keys for now, so `flutter run --release` works. 60 | signingConfig signingConfigs.debug 61 | } 62 | } 63 | } 64 | 65 | flutter { 66 | source '../..' 67 | } 68 | 69 | dependencies { 70 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 71 | } 72 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 15 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 30 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/money_management_app_ui_2/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.money_management_app_ui_2 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/FroJhoDev/MoneyManagementAppUI/07ae0f4a17f6d1dacdffb52b37a321a1226369b8/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FroJhoDev/MoneyManagementAppUI/07ae0f4a17f6d1dacdffb52b37a321a1226369b8/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FroJhoDev/MoneyManagementAppUI/07ae0f4a17f6d1dacdffb52b37a321a1226369b8/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FroJhoDev/MoneyManagementAppUI/07ae0f4a17f6d1dacdffb52b37a321a1226369b8/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FroJhoDev/MoneyManagementAppUI/07ae0f4a17f6d1dacdffb52b37a321a1226369b8/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /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.2.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 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /android/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 | -------------------------------------------------------------------------------- /ios/Flutter/Generated.xcconfig: -------------------------------------------------------------------------------- 1 | // This is a generated file; do not edit or check into version control. 2 | FLUTTER_ROOT=/home/frojho/snap/flutter/common/flutter 3 | FLUTTER_APPLICATION_PATH=/home/frojho/Develop/Pessoal/money_management_app_ui_2 4 | COCOAPODS_PARALLEL_CODE_SIGN=true 5 | FLUTTER_TARGET=lib/main.dart 6 | FLUTTER_BUILD_DIR=build 7 | FLUTTER_BUILD_NAME=1.0.0 8 | FLUTTER_BUILD_NUMBER=1 9 | EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386 10 | EXCLUDED_ARCHS[sdk=iphoneos*]=armv7 11 | DART_OBFUSCATION=false 12 | TRACK_WIDGET_CREATION=true 13 | TREE_SHAKE_ICONS=false 14 | PACKAGE_CONFIG=.dart_tool/package_config.json 15 | -------------------------------------------------------------------------------- /ios/Flutter/flutter_export_environment.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # This is a generated file; do not edit or check into version control. 3 | export "FLUTTER_ROOT=/home/frojho/snap/flutter/common/flutter" 4 | export "FLUTTER_APPLICATION_PATH=/home/frojho/Develop/Pessoal/money_management_app_ui_2" 5 | export "COCOAPODS_PARALLEL_CODE_SIGN=true" 6 | export "FLUTTER_TARGET=lib/main.dart" 7 | export "FLUTTER_BUILD_DIR=build" 8 | export "FLUTTER_BUILD_NAME=1.0.0" 9 | export "FLUTTER_BUILD_NUMBER=1" 10 | export "DART_OBFUSCATION=false" 11 | export "TRACK_WIDGET_CREATION=true" 12 | export "TREE_SHAKE_ICONS=false" 13 | export "PACKAGE_CONFIG=.dart_tool/package_config.json" 14 | -------------------------------------------------------------------------------- /ios/Runner/GeneratedPluginRegistrant.h: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #ifndef GeneratedPluginRegistrant_h 8 | #define GeneratedPluginRegistrant_h 9 | 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface GeneratedPluginRegistrant : NSObject 15 | + (void)registerWithRegistry:(NSObject*)registry; 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | #endif /* GeneratedPluginRegistrant_h */ 20 | -------------------------------------------------------------------------------- /ios/Runner/GeneratedPluginRegistrant.m: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #import "GeneratedPluginRegistrant.h" 8 | 9 | @implementation GeneratedPluginRegistrant 10 | 11 | + (void)registerWithRegistry:(NSObject*)registry { 12 | } 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'pages/home_page.dart'; 4 | 5 | void main() { 6 | runApp(const MyApp()); 7 | } 8 | 9 | class MyApp extends StatelessWidget { 10 | const MyApp({super.key}); 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return MaterialApp( 15 | title: 'Money Management', 16 | debugShowCheckedModeBanner: false, 17 | theme: ThemeData( 18 | useMaterial3: true, 19 | primarySwatch: Colors.purple, 20 | ), 21 | home: const HomePage(), 22 | ); 23 | } 24 | } -------------------------------------------------------------------------------- /lib/pages/dash_board_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:syncfusion_flutter_charts/charts.dart'; 3 | 4 | import '../styles/color_schema.dart'; 5 | 6 | class DashBoardPage extends StatefulWidget { 7 | const DashBoardPage({super.key}); 8 | 9 | @override 10 | State createState() => _DashBoardPageState(); 11 | } 12 | 13 | class _DashBoardPageState extends State { 14 | late List<_ChartData> data; 15 | late TooltipBehavior _tooltip; 16 | 17 | @override 18 | void initState() { 19 | data = [ 20 | _ChartData('Restaurante', 12), 21 | _ChartData('Jogos', 15), 22 | _ChartData('TV', 30), 23 | _ChartData('Mercado', 6.4), 24 | _ChartData('Outros', 14) 25 | ]; 26 | _tooltip = TooltipBehavior(enable: true); 27 | super.initState(); 28 | } 29 | 30 | @override 31 | Widget build(BuildContext context) { 32 | return Scaffold( 33 | appBar: AppBar( 34 | elevation: 0, 35 | actions: [ 36 | IconButton( 37 | icon: const Icon(Icons.notifications_none), 38 | color: Colors.black54, 39 | iconSize: 30.0, 40 | onPressed: () {}, 41 | ), 42 | ], 43 | ), 44 | body: SingleChildScrollView( 45 | child: Column( 46 | crossAxisAlignment: CrossAxisAlignment.start, 47 | children: [ 48 | Padding( 49 | padding: 50 | const EdgeInsets.symmetric(horizontal: 25.0, vertical: 30.0), 51 | child: Text( 52 | 'Dashboard', 53 | style: TextStyle( 54 | color: Colors.black.withOpacity(0.7), 55 | fontWeight: FontWeight.bold, 56 | fontSize: 32.0), 57 | ), 58 | ), 59 | Padding( 60 | padding: const EdgeInsets.symmetric(horizontal: 25.0), 61 | child: Container( 62 | width: double.infinity, 63 | decoration: BoxDecoration( 64 | color: ColorSchema.primaryColor, 65 | borderRadius: const BorderRadius.all(Radius.circular(20.0)), 66 | boxShadow: [ 67 | BoxShadow( 68 | color: Colors.black.withOpacity(0.1), 69 | offset: const Offset(0.0, 0.3), 70 | blurRadius: 15.0) 71 | ]), 72 | child: Column( 73 | children: [ 74 | Padding( 75 | padding: const EdgeInsets.symmetric( 76 | horizontal: 25.0, vertical: 25.0), 77 | child: Row( 78 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 79 | children: [ 80 | Column( 81 | crossAxisAlignment: CrossAxisAlignment.start, 82 | mainAxisSize: MainAxisSize.min, 83 | children: const [ 84 | Text( 85 | '2800,00', 86 | style: TextStyle( 87 | color: Colors.white, 88 | fontSize: 30.0, 89 | fontWeight: FontWeight.bold), 90 | ), 91 | SizedBox(height: 15.0), 92 | Text( 93 | 'Avelilable Balance', 94 | style: TextStyle( 95 | color: Colors.white, 96 | fontSize: 14.0, 97 | ), 98 | ) 99 | ], 100 | ), 101 | IconButton( 102 | icon: const Icon(Icons.show_chart), 103 | onPressed: () {}, 104 | color: Colors.white, 105 | iconSize: 30.0, 106 | ) 107 | ], 108 | ), 109 | ), 110 | SfCartesianChart( 111 | primaryXAxis: CategoryAxis(), 112 | primaryYAxis: 113 | NumericAxis(minimum: 0, maximum: 40, interval: 10), 114 | tooltipBehavior: _tooltip, 115 | series: >[ 116 | BarSeries<_ChartData, String>( 117 | dataSource: data, 118 | xValueMapper: (_ChartData data, _) => data.x, 119 | yValueMapper: (_ChartData data, _) => data.y, 120 | name: 'Gold', 121 | color: Colors.orange, 122 | ), 123 | ], 124 | ), 125 | ], 126 | ), 127 | ), 128 | ), 129 | Padding( 130 | padding: 131 | const EdgeInsets.only(left: 25.0, right: 25.0, top: 30.0), 132 | child: Text( 133 | 'Recent Activity', 134 | style: TextStyle( 135 | color: Colors.black.withOpacity(0.7), 136 | fontSize: 20.0, 137 | fontWeight: FontWeight.bold), 138 | ), 139 | ), 140 | const SizedBox(height: 25.0), 141 | Padding( 142 | padding: 143 | const EdgeInsets.only(left: 25.0, right: 25.0, bottom: 10.0), 144 | child: Column( 145 | children: [ 146 | Padding( 147 | padding: const EdgeInsets.symmetric(vertical: 5.0), 148 | child: Row( 149 | children: [ 150 | Material( 151 | borderRadius: BorderRadius.circular(100.0), 152 | color: Colors.purple.withOpacity(0.1), 153 | child: const Padding( 154 | padding: EdgeInsets.all(15.0), 155 | child: Text( 156 | 'JO', 157 | style: TextStyle( 158 | color: Colors.purple, 159 | fontSize: 24.0, 160 | fontWeight: FontWeight.bold), 161 | ), 162 | ), 163 | ), 164 | const SizedBox(width: 25.0), 165 | Expanded( 166 | child: Column( 167 | crossAxisAlignment: CrossAxisAlignment.start, 168 | children: [ 169 | const Text( 170 | 'Load Actinity', 171 | style: TextStyle( 172 | color: Colors.black, 173 | fontSize: 18.0, 174 | fontWeight: FontWeight.bold), 175 | ), 176 | Text( 177 | 'Sent Money', 178 | style: TextStyle( 179 | color: Colors.black.withOpacity(0.8), 180 | fontSize: 16.0, 181 | fontWeight: FontWeight.bold), 182 | ) 183 | ], 184 | ), 185 | ), 186 | const Text( 187 | '- 240.0', 188 | style: TextStyle( 189 | color: Colors.black, 190 | fontSize: 18.0, 191 | fontWeight: FontWeight.bold), 192 | ) 193 | ], 194 | ), 195 | ), 196 | const Padding( 197 | padding: EdgeInsets.symmetric(horizontal: 25.0), 198 | child: Divider(), 199 | ), 200 | Padding( 201 | padding: const EdgeInsets.symmetric(vertical: 5.0), 202 | child: Row( 203 | children: [ 204 | Material( 205 | borderRadius: BorderRadius.circular(100.0), 206 | color: Colors.orange.withOpacity(0.1), 207 | child: const Padding( 208 | padding: EdgeInsets.all(15.0), 209 | child: Text( 210 | 'MA', 211 | style: TextStyle( 212 | color: Colors.orange, 213 | fontSize: 24.0, 214 | fontWeight: FontWeight.bold), 215 | ), 216 | ), 217 | ), 218 | const SizedBox(width: 25.0), 219 | Expanded( 220 | child: Column( 221 | crossAxisAlignment: CrossAxisAlignment.start, 222 | children: [ 223 | const Text( 224 | 'Load Actinity', 225 | style: TextStyle( 226 | color: Colors.black, 227 | fontSize: 18.0, 228 | fontWeight: FontWeight.bold), 229 | ), 230 | Text( 231 | 'Request Money', 232 | style: TextStyle( 233 | color: Colors.black.withOpacity(0.8), 234 | fontSize: 16.0, 235 | fontWeight: FontWeight.bold), 236 | ) 237 | ], 238 | ), 239 | ), 240 | const Text( 241 | ' 360.0', 242 | style: TextStyle( 243 | color: Colors.black, 244 | fontSize: 18.0, 245 | fontWeight: FontWeight.bold), 246 | ) 247 | ], 248 | ), 249 | ), 250 | ], 251 | ), 252 | ) 253 | ], 254 | ), 255 | ), 256 | ); 257 | } 258 | } 259 | 260 | class _ChartData { 261 | _ChartData(this.x, this.y); 262 | 263 | final String x; 264 | final double y; 265 | } 266 | -------------------------------------------------------------------------------- /lib/pages/home_page.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'dash_board_page.dart'; 4 | import '../styles/color_schema.dart'; 5 | import '../utils/custom_shape_clipper.dart'; 6 | import '../widgets/cards_options_widget.dart'; 7 | import '../widgets/up_coming_card_widget.dart'; 8 | 9 | class HomePage extends StatelessWidget { 10 | const HomePage({super.key}); 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return Scaffold( 15 | backgroundColor: ColorSchema.backgroundColor, 16 | appBar: AppBar( 17 | elevation: 0, 18 | backgroundColor: ColorSchema.primaryColor, 19 | leading: IconButton( 20 | icon: const Icon(Icons.menu), 21 | color: Colors.white, 22 | iconSize: 30.0, 23 | onPressed: () {}, 24 | ), 25 | actions: [ 26 | IconButton( 27 | icon: const Icon(Icons.notifications_none), 28 | color: Colors.white, 29 | iconSize: 30.0, 30 | onPressed: () {}, 31 | ), 32 | ], 33 | ), 34 | body: SingleChildScrollView( 35 | child: Column( 36 | crossAxisAlignment: CrossAxisAlignment.start, 37 | children: [ 38 | Stack( 39 | children: [ 40 | ClipPath( 41 | clipper: CustomShapeClipper(), 42 | child: Container( 43 | height: 350.0, 44 | decoration: BoxDecoration(color: ColorSchema.primaryColor), 45 | ), 46 | ), 47 | Padding( 48 | padding: const EdgeInsets.symmetric( 49 | horizontal: 25.0, vertical: 20.0), 50 | child: Row( 51 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 52 | children: [ 53 | Column( 54 | mainAxisSize: MainAxisSize.min, 55 | crossAxisAlignment: CrossAxisAlignment.start, 56 | children: const [ 57 | Text( 58 | '2800,00', 59 | style: TextStyle( 60 | color: Colors.white, 61 | fontSize: 30.0, 62 | fontWeight: FontWeight.bold), 63 | ), 64 | SizedBox(height: 15.0), 65 | Text( 66 | 'Avalilable Balance', 67 | style: 68 | TextStyle(color: Colors.white, fontSize: 14.0), 69 | ) 70 | ], 71 | ), 72 | Material( 73 | elevation: 1.0, 74 | borderRadius: BorderRadius.circular(100.0), 75 | color: Colors.blue[300], 76 | child: MaterialButton( 77 | onPressed: () { 78 | Navigator.of(context).push(MaterialPageRoute( 79 | builder: (BuildContext context) => 80 | const DashBoardPage())); 81 | }, 82 | padding: const EdgeInsets.symmetric( 83 | vertical: 10.0, horizontal: 30.0), 84 | child: const Text( 85 | 'TOP UP', 86 | style: 87 | TextStyle(fontSize: 16.0, color: Colors.white), 88 | ), 89 | ), 90 | ) 91 | ], 92 | ), 93 | ), 94 | Padding( 95 | padding: const EdgeInsets.only( 96 | top: 120.0, right: 25.0, left: 25.0), 97 | child: Container( 98 | width: double.infinity, 99 | height: 370.0, 100 | decoration: BoxDecoration( 101 | color: Colors.white, 102 | borderRadius: 103 | const BorderRadius.all(Radius.circular(20.0)), 104 | boxShadow: [ 105 | BoxShadow( 106 | color: Colors.black.withOpacity(0.1), 107 | offset: const Offset(0.0, 3.0), 108 | blurRadius: 15.0) 109 | ]), 110 | child: Column( 111 | children: [ 112 | Padding( 113 | padding: const EdgeInsets.symmetric( 114 | horizontal: 40.0, vertical: 40.0), 115 | child: Row( 116 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 117 | children: const [ 118 | CardsOptionsWidget( 119 | text: 'Send', 120 | icon: Icon(Icons.send), 121 | color: Colors.purple, 122 | ), 123 | CardsOptionsWidget( 124 | text: 'Pay', 125 | icon: Icon(Icons.credit_card), 126 | color: Colors.blue, 127 | ), 128 | CardsOptionsWidget( 129 | text: 'Request', 130 | icon: Icon(Icons.receipt), 131 | color: Colors.orange, 132 | ), 133 | ], 134 | ), 135 | ), 136 | Padding( 137 | padding: const EdgeInsets.symmetric(horizontal: 40.0), 138 | child: Row( 139 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 140 | children: const [ 141 | CardsOptionsWidget( 142 | text: 'Invoice', 143 | icon: Icon(Icons.monetization_on), 144 | color: Colors.pink, 145 | ), 146 | CardsOptionsWidget( 147 | text: 'Charity', 148 | icon: Icon(Icons.favorite), 149 | color: Colors.purpleAccent, 150 | ), 151 | CardsOptionsWidget( 152 | text: 'Loan', 153 | icon: Icon(Icons.attach_money), 154 | color: Colors.deepPurple, 155 | ), 156 | ], 157 | ), 158 | ), 159 | const SizedBox(height: 15.0), 160 | const Divider(), 161 | const SizedBox(height: 15.0), 162 | Padding( 163 | padding: const EdgeInsets.symmetric(horizontal: 25.0), 164 | child: Row( 165 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 166 | children: [ 167 | const Expanded( 168 | child: Text( 169 | 'Lorem ipsum dolor sit amet dan aku tan moyan', 170 | textAlign: TextAlign.left, 171 | style: TextStyle( 172 | color: Colors.grey, 173 | fontWeight: FontWeight.bold), 174 | ), 175 | ), 176 | const SizedBox(width: 40.0), 177 | Material( 178 | borderRadius: BorderRadius.circular(100.0), 179 | color: Colors.blueAccent.withOpacity(0.1), 180 | child: IconButton( 181 | icon: const Icon(Icons.arrow_forward_ios), 182 | color: Colors.blueAccent, 183 | onPressed: () {}, 184 | ), 185 | ) 186 | ], 187 | ), 188 | ) 189 | ], 190 | ), 191 | ), 192 | ), 193 | ], 194 | ), 195 | Padding( 196 | padding: 197 | const EdgeInsets.symmetric(horizontal: 25.0, vertical: 30.0), 198 | child: Text( 199 | 'Upcoming', 200 | style: TextStyle( 201 | color: Colors.black.withOpacity(0.7), 202 | fontWeight: FontWeight.bold, 203 | fontSize: 20.0), 204 | ), 205 | ), 206 | Padding( 207 | padding: const EdgeInsets.only(left: 35.0, bottom: 25.0), 208 | child: SizedBox( 209 | height: 150.0, 210 | child: ListView( 211 | scrollDirection: Axis.horizontal, 212 | children: const [ 213 | UpComingCardWidget( 214 | title: 'Cred Card One', 215 | value: 280.0, 216 | color: Colors.purple, 217 | ), 218 | UpComingCardWidget( 219 | title: 'Cred Card Text Two', 220 | value: 260.0, 221 | color: Colors.blue, 222 | ), 223 | UpComingCardWidget( 224 | title: 'Cred Card Text Two', 225 | value: 210.0, 226 | color: Colors.orange, 227 | ), 228 | UpComingCardWidget( 229 | title: 'Cred Card Text Two', 230 | value: 110.0, 231 | color: Colors.pink, 232 | ), 233 | ], 234 | ), 235 | ), 236 | ), 237 | ], 238 | ), 239 | ), 240 | ); 241 | } 242 | } 243 | -------------------------------------------------------------------------------- /lib/styles/color_schema.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ColorSchema { 4 | static Color primaryColor = const Color.fromRGBO(255, 82, 48, 1); 5 | static Color backgroundColor = const Color.fromRGBO(244, 244, 244, 1); 6 | } 7 | -------------------------------------------------------------------------------- /lib/utils/custom_shape_clipper.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | 3 | class CustomShapeClipper extends CustomClipper { 4 | @override 5 | Path getClip(Size size) { 6 | var path = Path(); 7 | 8 | path.lineTo(0.0, 390.0 - 200); 9 | path.quadraticBezierTo(size.width / 2, 280, size.width, 390.0 - 200); 10 | path.lineTo(size.width, 0.0); 11 | path.close(); 12 | return path; 13 | } 14 | 15 | @override 16 | bool shouldReclip(CustomClipper oldClipper) => true; 17 | } 18 | -------------------------------------------------------------------------------- /lib/widgets/cards_options_widget.dart: -------------------------------------------------------------------------------- 1 | // ignore_for_file: public_member_api_docs, sort_constructors_first 2 | import 'package:flutter/material.dart'; 3 | 4 | class CardsOptionsWidget extends StatelessWidget { 5 | final String text; 6 | final Icon icon; 7 | final Color color; 8 | 9 | const CardsOptionsWidget({ 10 | Key? key, 11 | required this.text, 12 | required this.icon, 13 | required this.color, 14 | }) : super(key: key); 15 | 16 | @override 17 | Widget build(BuildContext context) { 18 | return Column( 19 | children: [ 20 | Material( 21 | borderRadius: BorderRadius.circular(100.0), 22 | color: color.withOpacity(0.1), 23 | child: IconButton( 24 | padding: const EdgeInsets.all(15.0), 25 | icon: icon, 26 | color: color, 27 | iconSize: 30.0, 28 | onPressed: () {}, 29 | ), 30 | ), 31 | const SizedBox(height: 8.0), 32 | Text( 33 | text, 34 | style: const TextStyle( 35 | color: Colors.black54, 36 | fontWeight: FontWeight.bold, 37 | ), 38 | ) 39 | ], 40 | ); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /lib/widgets/up_coming_card_widget.dart: -------------------------------------------------------------------------------- 1 | // ignore_for_file: public_member_api_docs, sort_constructors_first 2 | import 'package:flutter/material.dart'; 3 | 4 | class UpComingCardWidget extends StatelessWidget { 5 | final String title; 6 | final double value; 7 | final Color color; 8 | 9 | const UpComingCardWidget({ 10 | Key? key, 11 | required this.title, 12 | required this.value, 13 | required this.color, 14 | }) : super(key: key); 15 | 16 | @override 17 | Widget build(BuildContext context) { 18 | return Padding( 19 | padding: const EdgeInsets.only(right: 15.0), 20 | child: Container( 21 | width: 180, 22 | decoration: BoxDecoration( 23 | color: color, 24 | borderRadius: const BorderRadius.all(Radius.circular(25.0))), 25 | child: Padding( 26 | padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 30.0), 27 | child: Column( 28 | crossAxisAlignment: CrossAxisAlignment.start, 29 | children: [ 30 | Text(title, 31 | style: const TextStyle( 32 | color: Colors.white, fontWeight: FontWeight.bold)), 33 | const SizedBox(height: 30.0), 34 | Text( 35 | r'R$ ' + value.toString(), 36 | softWrap: true, 37 | style: const TextStyle( 38 | fontSize: 22.0, 39 | color: Colors.white, 40 | fontWeight: FontWeight.bold), 41 | ) 42 | ], 43 | ), 44 | ), 45 | ), 46 | ); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /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: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "2.10.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: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c 25 | url: "https://pub.dev" 26 | source: hosted 27 | version: "1.2.1" 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: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 41 | url: "https://pub.dev" 42 | source: hosted 43 | version: "1.17.0" 44 | cupertino_icons: 45 | dependency: "direct main" 46 | description: 47 | name: cupertino_icons 48 | sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be 49 | url: "https://pub.dev" 50 | source: hosted 51 | version: "1.0.5" 52 | fake_async: 53 | dependency: transitive 54 | description: 55 | name: fake_async 56 | sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" 57 | url: "https://pub.dev" 58 | source: hosted 59 | version: "1.3.1" 60 | flutter: 61 | dependency: "direct main" 62 | description: flutter 63 | source: sdk 64 | version: "0.0.0" 65 | flutter_lints: 66 | dependency: "direct dev" 67 | description: 68 | name: flutter_lints 69 | sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c 70 | url: "https://pub.dev" 71 | source: hosted 72 | version: "2.0.1" 73 | flutter_test: 74 | dependency: "direct dev" 75 | description: flutter 76 | source: sdk 77 | version: "0.0.0" 78 | intl: 79 | dependency: transitive 80 | description: 81 | name: intl 82 | sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6 83 | url: "https://pub.dev" 84 | source: hosted 85 | version: "0.18.0" 86 | js: 87 | dependency: transitive 88 | description: 89 | name: js 90 | sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" 91 | url: "https://pub.dev" 92 | source: hosted 93 | version: "0.6.5" 94 | lints: 95 | dependency: transitive 96 | description: 97 | name: lints 98 | sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" 99 | url: "https://pub.dev" 100 | source: hosted 101 | version: "2.0.1" 102 | matcher: 103 | dependency: transitive 104 | description: 105 | name: matcher 106 | sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" 107 | url: "https://pub.dev" 108 | source: hosted 109 | version: "0.12.13" 110 | material_color_utilities: 111 | dependency: transitive 112 | description: 113 | name: material_color_utilities 114 | sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 115 | url: "https://pub.dev" 116 | source: hosted 117 | version: "0.2.0" 118 | meta: 119 | dependency: transitive 120 | description: 121 | name: meta 122 | sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" 123 | url: "https://pub.dev" 124 | source: hosted 125 | version: "1.8.0" 126 | path: 127 | dependency: transitive 128 | description: 129 | name: path 130 | sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b 131 | url: "https://pub.dev" 132 | source: hosted 133 | version: "1.8.2" 134 | sky_engine: 135 | dependency: transitive 136 | description: flutter 137 | source: sdk 138 | version: "0.0.99" 139 | source_span: 140 | dependency: transitive 141 | description: 142 | name: source_span 143 | sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 144 | url: "https://pub.dev" 145 | source: hosted 146 | version: "1.9.1" 147 | stack_trace: 148 | dependency: transitive 149 | description: 150 | name: stack_trace 151 | sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 152 | url: "https://pub.dev" 153 | source: hosted 154 | version: "1.11.0" 155 | stream_channel: 156 | dependency: transitive 157 | description: 158 | name: stream_channel 159 | sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" 160 | url: "https://pub.dev" 161 | source: hosted 162 | version: "2.1.1" 163 | string_scanner: 164 | dependency: transitive 165 | description: 166 | name: string_scanner 167 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" 168 | url: "https://pub.dev" 169 | source: hosted 170 | version: "1.2.0" 171 | syncfusion_flutter_charts: 172 | dependency: "direct main" 173 | description: 174 | name: syncfusion_flutter_charts 175 | sha256: "34d4c1cd35de6ebe5a3cdfe72a1154fdb04117625517609308d992789121bf78" 176 | url: "https://pub.dev" 177 | source: hosted 178 | version: "20.4.50" 179 | syncfusion_flutter_core: 180 | dependency: transitive 181 | description: 182 | name: syncfusion_flutter_core 183 | sha256: "33141f9073c607bd113898d241aa6a03ccc1856a314bd061015180c35d47012f" 184 | url: "https://pub.dev" 185 | source: hosted 186 | version: "20.4.50" 187 | term_glyph: 188 | dependency: transitive 189 | description: 190 | name: term_glyph 191 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 192 | url: "https://pub.dev" 193 | source: hosted 194 | version: "1.2.1" 195 | test_api: 196 | dependency: transitive 197 | description: 198 | name: test_api 199 | sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 200 | url: "https://pub.dev" 201 | source: hosted 202 | version: "0.4.16" 203 | vector_math: 204 | dependency: transitive 205 | description: 206 | name: vector_math 207 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" 208 | url: "https://pub.dev" 209 | source: hosted 210 | version: "2.1.4" 211 | sdks: 212 | dart: ">=2.19.0-444.1.beta <4.0.0" 213 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: money_management_app_ui_2 2 | description: A new Flutter project. 3 | 4 | publish_to: 'none' 5 | version: 1.0.0+1 6 | 7 | environment: 8 | sdk: '>=2.19.0-444.1.beta <3.0.0' 9 | dependencies: 10 | flutter: 11 | sdk: flutter 12 | 13 | cupertino_icons: ^1.0.2 14 | syncfusion_flutter_charts: ^20.4.50 15 | 16 | dev_dependencies: 17 | flutter_test: 18 | sdk: flutter 19 | 20 | flutter_lints: ^2.0.0 21 | 22 | flutter: 23 | uses-material-design: true -------------------------------------------------------------------------------- /test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility in the flutter_test package. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | 11 | import 'package:money_management_app_ui_2/main.dart'; 12 | 13 | void main() { 14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 15 | // Build our app and trigger a frame. 16 | await tester.pumpWidget(const MyApp()); 17 | 18 | // Verify that our counter starts at 0. 19 | expect(find.text('0'), findsOneWidget); 20 | expect(find.text('1'), findsNothing); 21 | 22 | // Tap the '+' icon and trigger a frame. 23 | await tester.tap(find.byIcon(Icons.add)); 24 | await tester.pump(); 25 | 26 | // Verify that our counter has incremented. 27 | expect(find.text('0'), findsNothing); 28 | expect(find.text('1'), findsOneWidget); 29 | }); 30 | } 31 | --------------------------------------------------------------------------------