├── assets
├── icon.png
└── fonts
│ └── NotoSans-Regular.ttf
├── screenshots
├── Home.jpg
├── Rename.jpg
├── Settings.jpg
├── advanced.jpg
├── Analytics1.jpg
├── analytics2.jpg
└── analytics3.jpg
├── analysis_3.txt
├── analysis_4.txt
├── android
├── app
│ ├── src
│ │ ├── main
│ │ │ ├── res
│ │ │ │ ├── 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
│ │ │ │ │ ├── colors.xml
│ │ │ │ │ └── styles.xml
│ │ │ │ ├── drawable-hdpi
│ │ │ │ │ └── ic_launcher_foreground.png
│ │ │ │ ├── drawable-mdpi
│ │ │ │ │ └── ic_launcher_foreground.png
│ │ │ │ ├── drawable-xhdpi
│ │ │ │ │ └── ic_launcher_foreground.png
│ │ │ │ ├── drawable-xxhdpi
│ │ │ │ │ └── ic_launcher_foreground.png
│ │ │ │ ├── drawable-xxxhdpi
│ │ │ │ │ └── ic_launcher_foreground.png
│ │ │ │ ├── xml
│ │ │ │ │ └── file_paths.xml
│ │ │ │ ├── mipmap-anydpi-v26
│ │ │ │ │ └── ic_launcher.xml
│ │ │ │ ├── drawable
│ │ │ │ │ └── launch_background.xml
│ │ │ │ ├── drawable-v21
│ │ │ │ │ └── launch_background.xml
│ │ │ │ └── values-night
│ │ │ │ │ └── styles.xml
│ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ └── dark
│ │ │ │ │ └── pennywise
│ │ │ │ │ └── MainActivity.kt
│ │ │ └── AndroidManifest.xml
│ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ └── profile
│ │ │ └── AndroidManifest.xml
│ ├── proguard-rules.pro
│ └── build.gradle.kts
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
├── .gitignore
├── build.gradle.kts
└── settings.gradle.kts
├── lib
├── repositories
│ ├── transaction_repository.dart
│ ├── firestore_transaction_repository.dart
│ └── hive_transaction_repository.dart
├── models
│ ├── goal.dart
│ ├── loan.dart
│ ├── budget.dart
│ ├── budget.g.dart
│ ├── goal.g.dart
│ ├── category.dart
│ ├── account.g.dart
│ ├── category.g.dart
│ ├── account.dart
│ ├── transaction.g.dart
│ ├── loan.g.dart
│ └── transaction.dart
├── services
│ ├── biometric_service.dart
│ ├── auth_service.dart
│ └── sms_service.dart
├── main.dart
├── utils
│ └── app_theme.dart
├── widgets
│ ├── custom_bottom_nav_bar.dart
│ ├── theme_toggle.dart
│ ├── theme_reveal.dart
│ ├── analytics_chart.dart
│ ├── category_search_sheet.dart
│ ├── animated_digit_text.dart
│ ├── spending_chart.dart
│ ├── skeleton_loading.dart
│ └── profile_dialog.dart
└── screens
│ ├── lock_screen.dart
│ ├── analytics_screen.dart
│ ├── advance_screen.dart
│ ├── design_playground_screen.dart
│ └── sms_permission_screen.dart
├── analysis_5.txt
├── .gitignore
├── analysis_2.txt
├── analysis_options.yaml
├── analysis_6.txt
├── .metadata
├── analysis.txt
├── README.md
├── pubspec.yaml
├── project_analysis.txt
└── final_analysis.txt
/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/assets/icon.png
--------------------------------------------------------------------------------
/screenshots/Home.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/screenshots/Home.jpg
--------------------------------------------------------------------------------
/screenshots/Rename.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/screenshots/Rename.jpg
--------------------------------------------------------------------------------
/screenshots/Settings.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/screenshots/Settings.jpg
--------------------------------------------------------------------------------
/screenshots/advanced.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/screenshots/advanced.jpg
--------------------------------------------------------------------------------
/screenshots/Analytics1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/screenshots/Analytics1.jpg
--------------------------------------------------------------------------------
/screenshots/analytics2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/screenshots/analytics2.jpg
--------------------------------------------------------------------------------
/screenshots/analytics3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/screenshots/analytics3.jpg
--------------------------------------------------------------------------------
/analysis_3.txt:
--------------------------------------------------------------------------------
1 | Analyzing 2 items...
2 | No issues found! (ran in 4.4s)
3 |
--------------------------------------------------------------------------------
/analysis_4.txt:
--------------------------------------------------------------------------------
1 | Analyzing all_transactions_screen.dart...
2 | No issues found! (ran in 3.8s)
3 |
--------------------------------------------------------------------------------
/assets/fonts/NotoSans-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/assets/fonts/NotoSans-Regular.ttf
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
2 | android.useAndroidX=true
3 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #00000000
4 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bhanu7773-dev/PennyWise/HEAD/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/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-8.14-all.zip
6 |
--------------------------------------------------------------------------------
/android/app/src/main/res/xml/file_paths.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 | .cxx/
9 |
10 | # Remember to never publicly share your keystore.
11 | # See https://flutter.dev/to/reference-keystore
12 | key.properties
13 | **/*.keystore
14 | **/*.jks
15 |
--------------------------------------------------------------------------------
/lib/repositories/transaction_repository.dart:
--------------------------------------------------------------------------------
1 | import '../models/transaction.dart';
2 |
3 | abstract class TransactionRepository {
4 | Future> getTransactions();
5 | Future addTransaction(Transaction transaction);
6 | Future deleteTransaction(String id);
7 | Future updateTransaction(Transaction transaction);
8 | Future clear();
9 | }
10 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-v21/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/analysis_5.txt:
--------------------------------------------------------------------------------
1 | Analyzing transaction_list.dart...
2 |
3 | info • Don't invoke 'print' in production code • lib/widgets/transaction_list.dart:245:9 • avoid_print
4 | info • Don't invoke 'print' in production code • lib/widgets/transaction_list.dart:246:9 • avoid_print
5 | info • Don't invoke 'print' in production code • lib/widgets/transaction_list.dart:247:9 • avoid_print
6 | info • Don't invoke 'print' in production code • lib/widgets/transaction_list.dart:248:9 • avoid_print
7 |
8 | 4 issues found. (ran in 4.8s)
9 |
--------------------------------------------------------------------------------
/android/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | id("com.google.gms.google-services") version "4.4.4" apply false
3 | id("com.google.firebase.crashlytics") version "3.0.2" apply false
4 | }
5 |
6 | allprojects {
7 | repositories {
8 | google()
9 | mavenCentral()
10 | }
11 | }
12 |
13 | val newBuildDir: Directory =
14 | rootProject.layout.buildDirectory
15 | .dir("../../build")
16 | .get()
17 | rootProject.layout.buildDirectory.value(newBuildDir)
18 |
19 | subprojects {
20 | val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
21 | project.layout.buildDirectory.value(newSubprojectBuildDir)
22 | }
23 | subprojects {
24 | project.evaluationDependsOn(":app")
25 | }
26 |
27 | tasks.register("clean") {
28 | delete(rootProject.layout.buildDirectory)
29 | }
30 |
--------------------------------------------------------------------------------
/android/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | val flutterSdkPath =
3 | run {
4 | val properties = java.util.Properties()
5 | file("local.properties").inputStream().use { properties.load(it) }
6 | val flutterSdkPath = properties.getProperty("flutter.sdk")
7 | require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
8 | flutterSdkPath
9 | }
10 |
11 | includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
12 |
13 | repositories {
14 | google()
15 | mavenCentral()
16 | gradlePluginPortal()
17 | }
18 | }
19 |
20 | plugins {
21 | id("dev.flutter.flutter-plugin-loader") version "1.0.0"
22 | id("com.android.application") version "8.11.1" apply false
23 | id("org.jetbrains.kotlin.android") version "2.2.20" apply false
24 | }
25 |
26 | include(":app")
27 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .build/
9 | .buildlog/
10 | .history
11 | .svn/
12 | .swiftpm/
13 | migrate_working_dir/
14 |
15 | # IntelliJ related
16 | *.iml
17 | *.ipr
18 | *.iws
19 | .idea/
20 |
21 | # The .vscode folder contains launch configuration and tasks you configure in
22 | # VS Code which you may wish to be included in version control, so this line
23 | # is commented out by default.
24 | #.vscode/
25 |
26 | # Flutter/Dart/Pub related
27 | **/doc/api/
28 | **/ios/Flutter/.last_build_id
29 | .dart_tool/
30 | .flutter-plugins-dependencies
31 | .pub-cache/
32 | .pub/
33 | /build/
34 | /coverage/
35 |
36 | # Symbolication related
37 | app.*.symbols
38 |
39 | # Obfuscation related
40 | app.*.map.json
41 |
42 | # Android Studio will place build artifacts here
43 | /android/app/debug
44 | /android/app/profile
45 | /android/app/release
46 |
47 | # Firebase Config
48 | google-services.json
49 | GoogleService-Info.plist
50 |
51 | # Signing
52 | android/key.properties
53 | *.jks
54 | *.keystore
55 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values-night/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/lib/models/goal.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:hive/hive.dart';
3 |
4 | part 'goal.g.dart';
5 |
6 | @HiveType(typeId: 5)
7 | class Goal extends HiveObject {
8 | @HiveField(0)
9 | final String id;
10 |
11 | @HiveField(1)
12 | final String title;
13 |
14 | @HiveField(2)
15 | final double targetAmount;
16 |
17 | @HiveField(3)
18 | double savedAmount;
19 |
20 | @HiveField(4)
21 | final DateTime? deadline;
22 |
23 | @HiveField(5)
24 | final int iconCode;
25 |
26 | @HiveField(6)
27 | final int colorValue;
28 |
29 | Goal({
30 | required this.id,
31 | required this.title,
32 | required this.targetAmount,
33 | this.savedAmount = 0.0,
34 | this.deadline,
35 | required this.iconCode,
36 | required this.colorValue,
37 | });
38 |
39 | IconData get icon => IconData(iconCode, fontFamily: 'MaterialIcons');
40 | Color get color => Color(colorValue);
41 | double get progress =>
42 | targetAmount > 0 ? (savedAmount / targetAmount).clamp(0.0, 1.0) : 0.0;
43 | bool get isCompleted => savedAmount >= targetAmount;
44 | }
45 |
--------------------------------------------------------------------------------
/lib/models/loan.dart:
--------------------------------------------------------------------------------
1 | import 'package:hive/hive.dart';
2 |
3 | part 'loan.g.dart';
4 |
5 | @HiveType(typeId: 3)
6 | enum LoanType {
7 | @HiveField(0)
8 | given, // Money I gave to someone (Lent)
9 | @HiveField(1)
10 | taken, // Money I took from someone (Borrowed)
11 | }
12 |
13 | @HiveType(typeId: 4)
14 | class Loan extends HiveObject {
15 | @HiveField(0)
16 | final String id;
17 |
18 | @HiveField(1)
19 | final String title; // Person name or purpose
20 |
21 | @HiveField(2)
22 | final double totalAmount;
23 |
24 | @HiveField(3)
25 | double paidAmount;
26 |
27 | @HiveField(4)
28 | final LoanType type;
29 |
30 | @HiveField(5)
31 | final DateTime startDate;
32 |
33 | @HiveField(6)
34 | final DateTime? dueDate;
35 |
36 | @HiveField(7)
37 | final String? notes;
38 |
39 | Loan({
40 | required this.id,
41 | required this.title,
42 | required this.totalAmount,
43 | this.paidAmount = 0.0,
44 | required this.type,
45 | required this.startDate,
46 | this.dueDate,
47 | this.notes,
48 | });
49 |
50 | double get remainingAmount => totalAmount - paidAmount;
51 | double get progress =>
52 | totalAmount > 0 ? (paidAmount / totalAmount).clamp(0.0, 1.0) : 0.0;
53 | bool get isCompleted => paidAmount >= totalAmount;
54 | }
55 |
--------------------------------------------------------------------------------
/android/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Flutter wrapper
2 | -keep class io.flutter.app.** { *; }
3 | -keep class io.flutter.plugin.** { *; }
4 | -keep class io.flutter.util.** { *; }
5 | -keep class io.flutter.view.** { *; }
6 | -keep class io.flutter.** { *; }
7 | -keep class io.flutter.plugins.** { *; }
8 |
9 | # Firebase
10 | -keep class com.google.firebase.** { *; }
11 | -keep class com.google.android.gms.** { *; }
12 |
13 | # Keep Hive models
14 | -keep class com.dark.pennywise.** { *; }
15 |
16 | # Play Core library (for deferred components / split APKs)
17 | -dontwarn com.google.android.play.core.splitcompat.SplitCompatApplication
18 | -dontwarn com.google.android.play.core.splitinstall.SplitInstallException
19 | -dontwarn com.google.android.play.core.splitinstall.SplitInstallManager
20 | -dontwarn com.google.android.play.core.splitinstall.SplitInstallManagerFactory
21 | -dontwarn com.google.android.play.core.splitinstall.SplitInstallRequest$Builder
22 | -dontwarn com.google.android.play.core.splitinstall.SplitInstallRequest
23 | -dontwarn com.google.android.play.core.splitinstall.SplitInstallSessionState
24 | -dontwarn com.google.android.play.core.splitinstall.SplitInstallStateUpdatedListener
25 | -dontwarn com.google.android.play.core.tasks.OnFailureListener
26 | -dontwarn com.google.android.play.core.tasks.OnSuccessListener
27 | -dontwarn com.google.android.play.core.tasks.Task
28 |
--------------------------------------------------------------------------------
/lib/models/budget.dart:
--------------------------------------------------------------------------------
1 | import 'package:hive/hive.dart';
2 |
3 | part 'budget.g.dart';
4 |
5 | @HiveType(typeId: 1)
6 | class Budget extends HiveObject {
7 | @HiveField(0)
8 | double monthlyLimit;
9 |
10 | @HiveField(1)
11 | int month; // 1-12
12 |
13 | @HiveField(2)
14 | int year;
15 |
16 | @HiveField(3)
17 | String accountId;
18 |
19 | @HiveField(4)
20 | Map categoryLimits;
21 |
22 | Budget({
23 | required this.monthlyLimit,
24 | required this.month,
25 | required this.year,
26 | this.accountId = 'default',
27 | Map? categoryLimits,
28 | }) : categoryLimits = categoryLimits ?? {};
29 |
30 | Map toJson() {
31 | return {
32 | 'monthlyLimit': monthlyLimit,
33 | 'month': month,
34 | 'year': year,
35 | 'accountId': accountId,
36 | 'categoryLimits': categoryLimits,
37 | };
38 | }
39 |
40 | factory Budget.fromJson(Map json) {
41 | return Budget(
42 | monthlyLimit: json['monthlyLimit'],
43 | month: json['month'],
44 | year: json['year'],
45 | accountId: json['accountId'] ?? 'default',
46 | categoryLimits:
47 | (json['categoryLimits'] as Map?)?.map(
48 | (k, v) => MapEntry(k, (v as num).toDouble()),
49 | ) ??
50 | {},
51 | );
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/analysis_2.txt:
--------------------------------------------------------------------------------
1 | Analyzing transaction_detail_screen.dart...
2 |
3 | info • 'activeColor' is deprecated and shouldn't be used. Use activeThumbColor instead. This feature was deprecated after v3.31.0-2.0.pre • lib/screens/transaction_detail_screen.dart:469:29 • deprecated_member_use
4 | info • 'value' is deprecated and shouldn't be used. Use component accessors like .r or .g, or toARGB32 for an explicit conversion • lib/screens/transaction_detail_screen.dart:740:33 • deprecated_member_use
5 | info • Don't use 'BuildContext's across async gaps • lib/screens/transaction_detail_screen.dart:1628:9 • use_build_context_synchronously
6 | info • Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check • lib/screens/transaction_detail_screen.dart:1968:30 • use_build_context_synchronously
7 | info • Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check • lib/screens/transaction_detail_screen.dart:1985:7 • use_build_context_synchronously
8 | info • Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check • lib/screens/transaction_detail_screen.dart:2490:26 • use_build_context_synchronously
9 | info • Don't use 'BuildContext's across async gaps, guarded by an unrelated 'mounted' check • lib/screens/transaction_detail_screen.dart:2491:26 • use_build_context_synchronously
10 |
11 | 7 issues found. (ran in 4.4s)
12 |
--------------------------------------------------------------------------------
/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 https://dart.dev/lints.
17 | #
18 | # Instead of disabling a lint rule for the entire project in the
19 | # section below, it can also be suppressed for a single line of code
20 | # or a specific dart file by using the `// ignore: name_of_lint` and
21 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file
22 | # producing the lint.
23 | rules:
24 | # avoid_print: false # Uncomment to disable the `avoid_print` rule
25 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
26 |
27 | # Additional information about this file can be found at
28 | # https://dart.dev/guides/language/analysis-options
29 |
--------------------------------------------------------------------------------
/lib/repositories/firestore_transaction_repository.dart:
--------------------------------------------------------------------------------
1 | import 'package:cloud_firestore/cloud_firestore.dart' hide Transaction;
2 | import '../models/transaction.dart';
3 | import 'transaction_repository.dart';
4 |
5 | class FirestoreTransactionRepository implements TransactionRepository {
6 | final String userId;
7 | final FirebaseFirestore _firestore = FirebaseFirestore.instance;
8 |
9 | FirestoreTransactionRepository(this.userId);
10 |
11 | CollectionReference