From 7169790b416d991b1c341f1a403ef9d7562022e0 Mon Sep 17 00:00:00 2001 From: luckyrat Date: Thu, 8 Aug 2024 16:04:04 +0100 Subject: [PATCH] Upgrade dependencies, including Flutter 3.22 Support Kotlin 1.9 plugins --- .fvm/fvm_config.json | 3 +- .fvmrc | 4 + .gitignore | 4 +- .vscode/settings.json | 132 +++++---- android/app/build.gradle | 11 +- .../keevault/keevault/MainActivityTest.java | 62 ++--- .../gradle/wrapper/gradle-wrapper.properties | 2 +- android/settings.gradle | 4 +- lib/widgets/account_create.dart | 4 +- lib/widgets/bottom.dart | 2 +- lib/widgets/coloured_safe_area_widget.dart | 2 +- lib/widgets/entry_field.dart | 110 ++++---- lib/widgets/group_move_tree.dart | 2 +- lib/widgets/icon_chooser.dart | 2 +- lib/widgets/kee_vault_app.dart | 24 +- lib/widgets/vault.dart | 1 + lib/widgets/vault_account_credentials.dart | 2 +- pubspec.lock | 256 ++++++++++-------- pubspec.yaml | 77 +++--- 19 files changed, 369 insertions(+), 335 deletions(-) create mode 100644 .fvmrc diff --git a/.fvm/fvm_config.json b/.fvm/fvm_config.json index b35b02a..1e31cdd 100644 --- a/.fvm/fvm_config.json +++ b/.fvm/fvm_config.json @@ -1,4 +1,3 @@ { - "flutterSdkVersion": "3.16.5", - "flavors": {} + "flutterSdkVersion": "3.22.2" } \ No newline at end of file diff --git a/.fvmrc b/.fvmrc new file mode 100644 index 0000000..26d017c --- /dev/null +++ b/.fvmrc @@ -0,0 +1,4 @@ +{ + "flutter": "3.22.2", + "flavors": {} +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6e1743a..3eee8d7 100644 --- a/.gitignore +++ b/.gitignore @@ -31,7 +31,6 @@ .pub/ /build/ .gradle/ -.fvm/flutter_sdk integration_test/test_bundle.dart # Web related @@ -57,3 +56,6 @@ ios/Flutter/KeeVault-generated.xcconfig ios/fastlane/report.xml ios/Runner.app.dSYM.zip ios/Runner.ipa + +# FVM Version Cache +.fvm/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index dca44d7..15f07ba 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,69 +1,67 @@ { - "dart.lineLength": 120, - "[dart]": { - "editor.rulers": [ - 80, - 120 - ], - }, - "cSpell.words": [ - "analyzer", - "analyzes", - "applocker", - "Autofilling", - "Autovalidate", - "Behavior", - "bloclistener", - "color", - "Colors", - "Compat", - "creds", - "Derivator", - "derivators", - "Dialog", - "FFTpassword", - "FFTtext", - "FFTusername", - "fluro", - "fromLTRB", - "kdbxstring", - "keepass", - "keevault", - "keevaultpendingautofillassociations", - "keyfile", - "keyvalue", - "oneplus", - "otpauth", - "Parcelable", - "pointycastle", - "quickunlock", - "Rect", - "reemit", - "reenter", - "Signup", - "sipi", - "textfield", - "treeview", - "unfocus", - "Unlocker", - "unprotect", - "yMMMMEEEEd", - "zxcvbn" - ], - "cSpell.ignorePaths": [ - "**/generated/**", - "phonetic.dart", - ".git", // Ignore the .git directory - "*.dll", // Ignore all .dll files. - "**/*.dll" // Ignore all .dll files - ], - "dart.flutterSdkPath": ".fvm/flutter_sdk", - // Remove .fvm files from search - "search.exclude": { - "**/.fvm": true - }, - // Remove from file watching - "files.watcherExclude": { - "**/.fvm": true - } + "dart.lineLength": 120, + "[dart]": { + "editor.rulers": [ + 80, + 120 + ] + }, + "cSpell.words": [ + "analyzer", + "analyzes", + "applocker", + "Autofilling", + "Autovalidate", + "Behavior", + "bloclistener", + "color", + "Colors", + "Compat", + "creds", + "Derivator", + "derivators", + "Dialog", + "FFTpassword", + "FFTtext", + "FFTusername", + "fluro", + "fromLTRB", + "kdbxstring", + "keepass", + "keevault", + "keevaultpendingautofillassociations", + "keyfile", + "keyvalue", + "oneplus", + "otpauth", + "Parcelable", + "pointycastle", + "quickunlock", + "Rect", + "reemit", + "reenter", + "Signup", + "sipi", + "textfield", + "treeview", + "unfocus", + "Unlocker", + "unprotect", + "yMMMMEEEEd", + "zxcvbn" + ], + "cSpell.ignorePaths": [ + "**/generated/**", + "phonetic.dart", + ".git", + "*.dll", + "**/*.dll" + ], + "dart.flutterSdkPath": ".fvm/versions/3.22.2", + "search.exclude": { + "**/.fvm": true + }, + "files.watcherExclude": { + "**/.fvm": true + } } \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index c4e9e6c..ad44f4d 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,6 +1,6 @@ plugins { id "com.android.application" - id "kotlin-android" + id 'org.jetbrains.kotlin.android' version '1.9.25' id "dev.flutter.flutter-gradle-plugin" } @@ -115,7 +115,7 @@ android { applicationId "com.keevault.keevault" applicationIdSuffix idSuffix minSdkVersion 29 - targetSdk 33 + targetSdk 34 versionCode flutterVersionCode.toInteger() versionName flutterVersionName resValue "string", "app_name", "Kee Vault" + nameSuffix @@ -145,7 +145,7 @@ android { } namespace 'com.keevault.keevault' - ndkVersion "23.1.7779620" + ndkVersion "26.1.10909125" } flutter { @@ -153,9 +153,8 @@ flutter { } dependencies { - //implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation 'org.tinylog:tinylog-api:2.6.2' implementation 'org.tinylog:tinylog-impl:2.6.2' implementation 'org.tinylog:slf4j-tinylog:2.6.2' - androidTestUtil "androidx.test:orchestrator:1.4.2" -} + androidTestUtil "androidx.test:orchestrator:1.5.0" +} \ No newline at end of file diff --git a/android/app/src/androidTest/java/com/keevault/keevault/MainActivityTest.java b/android/app/src/androidTest/java/com/keevault/keevault/MainActivityTest.java index fc7d49f..085727a 100644 --- a/android/app/src/androidTest/java/com/keevault/keevault/MainActivityTest.java +++ b/android/app/src/androidTest/java/com/keevault/keevault/MainActivityTest.java @@ -1,31 +1,31 @@ -package com.keevault.keevault; - -import androidx.test.platform.app.InstrumentationRegistry; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; -import pl.leancode.patrol.PatrolJUnitRunner; - -@RunWith(Parameterized.class) -public class MainActivityTest { - @Parameters(name = "{0}") - public static Object[] testCases() { - PatrolJUnitRunner instrumentation = (PatrolJUnitRunner) InstrumentationRegistry.getInstrumentation(); - instrumentation.setUp(MainActivity.class); - instrumentation.waitForPatrolAppService(); - return instrumentation.listDartTests(); - } - - public MainActivityTest(String dartTestName) { - this.dartTestName = dartTestName; - } - - private final String dartTestName; - - @Test - public void runDartTest() { - PatrolJUnitRunner instrumentation = (PatrolJUnitRunner) InstrumentationRegistry.getInstrumentation(); - instrumentation.runDartTest(dartTestName); - } -} \ No newline at end of file +//package com.keevault.keevault; +// +//import androidx.test.platform.app.InstrumentationRegistry; +//import org.junit.Test; +//import org.junit.runner.RunWith; +//import org.junit.runners.Parameterized; +//import org.junit.runners.Parameterized.Parameters; +//import pl.leancode.patrol.PatrolJUnitRunner; +// +//@RunWith(Parameterized.class) +//public class MainActivityTest { +// @Parameters(name = "{0}") +// public static Object[] testCases() { +// PatrolJUnitRunner instrumentation = (PatrolJUnitRunner) InstrumentationRegistry.getInstrumentation(); +// instrumentation.setUp(MainActivity.class); +// instrumentation.waitForPatrolAppService(); +// return instrumentation.listDartTests(); +// } +// +// public MainActivityTest(String dartTestName) { +// this.dartTestName = dartTestName; +// } +// +// private final String dartTestName; +// +// @Test +// public void runDartTest() { +// PatrolJUnitRunner instrumentation = (PatrolJUnitRunner) InstrumentationRegistry.getInstrumentation(); +// instrumentation.runDartTest(dartTestName); +// } +//} \ No newline at end of file diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 89e56bd..7aeeb11 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip diff --git a/android/settings.gradle b/android/settings.gradle index eac68e8..d75fec4 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -19,8 +19,8 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.3" apply false - id "org.jetbrains.kotlin.android" version "1.8.22" apply false + id "com.android.application" version '8.5.1' apply false + id "org.jetbrains.kotlin.android" version "1.9.25" apply false } include ":app" diff --git a/lib/widgets/account_create.dart b/lib/widgets/account_create.dart index bed9139..381716d 100644 --- a/lib/widgets/account_create.dart +++ b/lib/widgets/account_create.dart @@ -712,7 +712,7 @@ class _AccountCreateWidgetState extends State { try { blockingOverlay.hide(); } on Exception { - if (context.mounted) { + if (mounted) { BlockingOverlay.of(context).hide(); } } @@ -735,7 +735,7 @@ class _AccountCreateWidgetState extends State { try { blockingOverlay.hide(); } on Exception { - if (context.mounted) { + if (mounted) { BlockingOverlay.of(context).hide(); } } diff --git a/lib/widgets/bottom.dart b/lib/widgets/bottom.dart index 67f0685..0875132 100644 --- a/lib/widgets/bottom.dart +++ b/lib/widgets/bottom.dart @@ -123,7 +123,7 @@ class AccountDrawerWidget extends StatelessWidget { (EnvironmentConfig.iapAppleAppStore && KeeVaultPlatform.isIOS); final theme = Theme.of(context); final headerColor = - theme.brightness == Brightness.light ? theme.colorScheme.primary : theme.colorScheme.onBackground; + theme.brightness == Brightness.light ? theme.colorScheme.primary : theme.colorScheme.onSurface; final accountActionSection = (user?.email != null) ? ExpansionTile( initiallyExpanded: state is! VaultLoaded, diff --git a/lib/widgets/coloured_safe_area_widget.dart b/lib/widgets/coloured_safe_area_widget.dart index cb5d029..e040d6e 100644 --- a/lib/widgets/coloured_safe_area_widget.dart +++ b/lib/widgets/coloured_safe_area_widget.dart @@ -16,7 +16,7 @@ class ColouredSafeArea extends StatelessWidget { color: colour ?? Theme.of(context).appBarTheme.backgroundColor, child: SafeArea( child: Container( - color: Theme.of(context).colorScheme.background, + color: Theme.of(context).colorScheme.surface, child: child, ), ), diff --git a/lib/widgets/entry_field.dart b/lib/widgets/entry_field.dart index d25fed6..fee933d 100644 --- a/lib/widgets/entry_field.dart +++ b/lib/widgets/entry_field.dart @@ -261,71 +261,63 @@ class _EntryTextFieldState extends _EntryFieldState implements FieldDelegate { // only used by [_OtpEntryFieldState] throw UnsupportedError('Field does not support this action.'); case EntryAction.rename: - // Think this is a use_build_context_synchronously false positive at least - // as of Dart 3.1 but a quick sanity check here does minimal harm - if (context.mounted) { - final cubit = BlocProvider.of(context); - final newName = await SimplePromptDialog( - title: str.renamingField, - labelText: str.renameFieldEnterNewName, - initialValue: widget.field.name, - ).show(context); - if (newName != null) { - cubit.renameField(widget.field.key, widget.field.browserModel?.name, newName); - } + final cubit = BlocProvider.of(context); + final newName = await SimplePromptDialog( + title: str.renamingField, + labelText: str.renameFieldEnterNewName, + initialValue: widget.field.name, + ).show(context); + if (newName != null) { + cubit.renameField(widget.field.key, widget.field.browserModel?.name, newName); } break; case EntryAction.protect: - // Think this is a use_build_context_synchronously false positive at least - // as of Dart 3.1 but a quick sanity check here does minimal harm - if (context.mounted) { - if (_isProtected) { - final cubit = BlocProvider.of(context); - if (widget.field.fieldStorage == FieldStorage.JSON) { - cubit.updateField( - null, - widget.field.browserModel!.name, - value: PlainValue(widget.field.textValue), - browserModel: - widget.field.browserModel!.copyWith(type: kdbx.FieldType.Text, value: widget.field.textValue), - protect: false, - ); - } else { - cubit.updateField( - widget.field.key, - null, - value: PlainValue(widget.field.textValue), - protect: false, - ); - } + if (_isProtected) { + final cubit = BlocProvider.of(context); + if (widget.field.fieldStorage == FieldStorage.JSON) { + cubit.updateField( + null, + widget.field.browserModel!.name, + value: PlainValue(widget.field.textValue), + browserModel: + widget.field.browserModel!.copyWith(type: kdbx.FieldType.Text, value: widget.field.textValue), + protect: false, + ); } else { - final cubit = BlocProvider.of(context); - if (widget.field.fieldStorage == FieldStorage.JSON) { - cubit.updateField( - null, - widget.field.browserModel!.name, - value: ProtectedValue.fromString(widget.field.textValue), - browserModel: - widget.field.browserModel!.copyWith(type: kdbx.FieldType.Password, value: widget.field.textValue), - protect: true, - ); - } else { - cubit.updateField( - widget.field.key, - null, - value: ProtectedValue.fromString(widget.field.textValue), - protect: true, - ); - } + cubit.updateField( + widget.field.key, + null, + value: PlainValue(widget.field.textValue), + protect: false, + ); + } + } else { + final cubit = BlocProvider.of(context); + if (widget.field.fieldStorage == FieldStorage.JSON) { + cubit.updateField( + null, + widget.field.browserModel!.name, + value: ProtectedValue.fromString(widget.field.textValue), + browserModel: + widget.field.browserModel!.copyWith(type: kdbx.FieldType.Password, value: widget.field.textValue), + protect: true, + ); + } else { + cubit.updateField( + widget.field.key, + null, + value: ProtectedValue.fromString(widget.field.textValue), + protect: true, + ); } - setState(() { - if (_isProtected) { - _isValueObscured = false; - } else if (widget.field.textValue.isNotEmpty) { - _isValueObscured = true; - } - }); } + setState(() { + if (_isProtected) { + _isValueObscured = false; + } else if (widget.field.textValue.isNotEmpty) { + _isValueObscured = true; + } + }); break; case EntryAction.delete: widget.onDelete(); diff --git a/lib/widgets/group_move_tree.dart b/lib/widgets/group_move_tree.dart index 8de315d..e1338fa 100644 --- a/lib/widgets/group_move_tree.dart +++ b/lib/widgets/group_move_tree.dart @@ -126,7 +126,7 @@ abstract class _MoveTreeListWidgetState extends St parentLabelOverflow: TextOverflow.ellipsis, ); return Container( - color: theme.colorScheme.background, + color: theme.colorScheme.surface, child: SafeArea( minimum: const EdgeInsets.all(8.0), child: Column( diff --git a/lib/widgets/icon_chooser.dart b/lib/widgets/icon_chooser.dart index 9c490c9..8dfe943 100644 --- a/lib/widgets/icon_chooser.dart +++ b/lib/widgets/icon_chooser.dart @@ -84,7 +84,7 @@ class _IconChooserState extends State { actions: [ TextButton( style: ButtonStyle( - padding: MaterialStateProperty.resolveWith( + padding: WidgetStateProperty.resolveWith( (states) => const EdgeInsets.symmetric(horizontal: 20), ), ), diff --git a/lib/widgets/kee_vault_app.dart b/lib/widgets/kee_vault_app.dart index fd50717..aeeee14 100644 --- a/lib/widgets/kee_vault_app.dart +++ b/lib/widgets/kee_vault_app.dart @@ -170,42 +170,42 @@ class KeeVaultAppState extends State with WidgetsBindingObserver, T style: OutlinedButton.styleFrom(foregroundColor: isDark ? palette[100] : palette[600])), textButtonTheme: TextButtonThemeData(style: TextButton.styleFrom(foregroundColor: theme.colorScheme.secondary)), checkboxTheme: CheckboxThemeData( - fillColor: MaterialStateProperty.resolveWith((Set states) { - if (states.contains(MaterialState.disabled)) { + fillColor: WidgetStateProperty.resolveWith((Set states) { + if (states.contains(WidgetState.disabled)) { return null; } - if (states.contains(MaterialState.selected)) { + if (states.contains(WidgetState.selected)) { return theme.colorScheme.secondary; } return null; }), ), radioTheme: RadioThemeData( - fillColor: MaterialStateProperty.resolveWith((Set states) { - if (states.contains(MaterialState.disabled)) { + fillColor: WidgetStateProperty.resolveWith((Set states) { + if (states.contains(WidgetState.disabled)) { return null; } - if (states.contains(MaterialState.selected)) { + if (states.contains(WidgetState.selected)) { return theme.colorScheme.secondary; } return null; }), ), switchTheme: SwitchThemeData( - thumbColor: MaterialStateProperty.resolveWith((Set states) { - if (states.contains(MaterialState.disabled)) { + thumbColor: WidgetStateProperty.resolveWith((Set states) { + if (states.contains(WidgetState.disabled)) { return null; } - if (states.contains(MaterialState.selected)) { + if (states.contains(WidgetState.selected)) { return theme.colorScheme.secondary; } return null; }), - trackColor: MaterialStateProperty.resolveWith((Set states) { - if (states.contains(MaterialState.disabled)) { + trackColor: WidgetStateProperty.resolveWith((Set states) { + if (states.contains(WidgetState.disabled)) { return null; } - if (states.contains(MaterialState.selected)) { + if (states.contains(WidgetState.selected)) { return theme.colorScheme.secondary; } return null; diff --git a/lib/widgets/vault.dart b/lib/widgets/vault.dart index dec57b0..7a53c22 100644 --- a/lib/widgets/vault.dart +++ b/lib/widgets/vault.dart @@ -45,6 +45,7 @@ class _VaultWidgetState extends State with WidgetsBindingObserver { } final AutofillState autofillState = BlocProvider.of(context).state; if (autofillState is AutofillModeActive) { + //TODO: Maybe proceed if AutofillSaved? Or clear that state after applifecyclestate resumes? Until then, ................... l.t('Skip refresh due to state: ${autofillState.runtimeType}'); return; } diff --git a/lib/widgets/vault_account_credentials.dart b/lib/widgets/vault_account_credentials.dart index 2368207..07b116d 100644 --- a/lib/widgets/vault_account_credentials.dart +++ b/lib/widgets/vault_account_credentials.dart @@ -121,7 +121,7 @@ class _VaultAccountCredentialsWidgetState extends State=3.2.0 <4.0.0" - flutter: ">=3.16.0" + dart: ">=3.4.1 <4.0.0" + flutter: ">=3.19.0" diff --git a/pubspec.yaml b/pubspec.yaml index 984f8c7..9c26c94 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,48 +23,48 @@ environment: dependencies: flutter: sdk: flutter - logger: 2.0.2+1 + logger: 2.3.0 logging: ^1.2.0 kdbx: git: url: https://github.com/kee-org/kdbx.dart.git ref: master - path_provider: ^2.1.1 + path_provider: ^2.1.3 biometric_storage: git: url: https://github.com/kee-org/biometric_storage.git ref: keevault - package_info_plus: ^5.0.1 - shared_preferences: ^2.2.2 - flutter_settings_screens: 0.3.3-null-safety+2 + package_info_plus: ^8.0.0 + shared_preferences: ^2.2.3 + flutter_settings_screens: 0.3.4 argon2_ffi: git: url: https://github.com/kee-org/argon2_ffi.git - ref: master + ref: api34 flutter_autofill_service: git: url: https://github.com/kee-org/flutter_autofill_service.git ref: master - bloc: ^8.1.2 - flutter_bloc: ^8.1.3 + bloc: ^8.1.4 + flutter_bloc: ^8.1.6 fluro: ^2.0.5 - dio: ^5.3.3 + dio: ^5.5.0 crypto_keys: ^0.3.0+1 - pointycastle: ^3.7.3 + pointycastle: ^3.9.1 srp: git: url: https://github.com/kee-org/srp.dart.git ref: master animate_icons: ^2.0.0 - animations: ^2.0.8 - font_awesome_flutter: ^10.6.0 + animations: ^2.0.11 + font_awesome_flutter: ^10.7.0 public_suffix: ^3.0.0 - url_launcher: ^6.2.1 + url_launcher: ^6.3.0 otp: ^3.1.4 tuple: ^2.0.2 - collection: ^1.17.2 - jiffy: ^6.2.1 + collection: ^1.18.0 + jiffy: ^6.3.1 # characters: ^1.2.0 flutter_treeview: git: @@ -77,7 +77,7 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.6 + cupertino_icons: ^1.0.8 flutter_persistent_queue: git: @@ -86,27 +86,24 @@ dependencies: flutter_localizations: sdk: flutter - matomo_tracker: - git: - url: https://github.com/Floating-Dartists/matomo-tracker.git - ref: main - file_picker: ^6.0.0 + matomo_tracker: ^5.0.0 + file_picker: ^8.0.6 zxcvbn: ^1.0.0 flutter_rating_bar: ^4.0.1 - mime: ^1.0.4 - share_plus: ^7.2.1 - path: ^1.8.3 #flutter sdk always lags behind so upgrade this only when needed - permission_handler: ^11.0.1 + mime: ^1.0.5 + share_plus: ^10.0.0 + path: ^1.9.0 #flutter sdk always lags behind so upgrade this only when needed + permission_handler: ^11.3.1 flutter_file_dialog: ^3.0.2 base32: ^2.1.3 flutter_speed_dial: ^7.0.0 receive_intent: ^0.2.5 - platform: ^3.1.3 - email_validator: ^2.1.17 + platform: ^3.1.5 + email_validator: ^3.0.0 convert: ^3.1.1 - meta: ^1.9.1 + meta: ^1.12.0 argon2_ffi_base: ^1.1.1 - uuid: ^4.3.3 + uuid: ^4.4.0 clock: ^1.1.1 flutter_inapp_purchase: git: @@ -116,10 +113,14 @@ dependencies: git: url: https://github.com/kee-org/sensitive_clipboard ref: master - rate_my_app: 2.0.0 # fix until at least > 2.0.0 - archive: ^3.4.6 - device_info_plus: ^9.1.0 - # barcode_scan2: ^4.3.0 + #rate_my_app: ^2.2.0 + rate_my_app: + git: + url: https://github.com/kee-org/RateMyApp + ref: api34 + archive: ^3.6.1 + device_info_plus: ^10.1.1 + # barcode_scan2: ^4.3.3 barcode_scan2: git: url: https://github.com/kee-org/barcode_scan2 @@ -129,14 +130,20 @@ dev_dependencies: flutter_test: sdk: flutter flutter_launcher_icons: "^0.13.1" - flutter_lints: ^3.0.1 + flutter_lints: ^3.0.2 dependency_validator: ^3.2.3 - flutter_native_splash: ^2.3.5 + flutter_native_splash: ^2.4.1 #patrol: ^2.2.3 dependency_overrides: # flutter_autofill_service: # path: ../flutter_autofill_service/ + # barcode_scan2: + # path: ../barcode_scan2/ + # rate_my_app: + # path: ../RateMyApp/ + # share_plus: + # path: ../plus_plugins/packages/share_plus/share_plus/ # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec