From d99050823789b0b05e33a2e18c3cb6576e7bf29c Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 1 Oct 2024 12:25:11 +1000 Subject: [PATCH] Update Requirements (#541) * Update package requiremenst * github workflow updates * ios build updates * Theme adjustments * Further updates * Fix typo * Deprecated imperative apply of Flutter's Gradle plugins Ref: https://docs.flutter.dev/release/breaking-changes/flutter-gradle-plugin-apply * Refactor wedge scanner * Add context checks * Adjust behaviour if testing * Further refactoring * Moar checks * Logic fix * Fix for wedge scanner test * Fix for barcode processing * Fix * Yet another fix --- .github/workflows/android.yaml | 2 +- .github/workflows/ci.yaml | 2 +- .github/workflows/ios.yaml | 2 +- android/app/build.gradle | 16 +- android/build.gradle | 14 - android/settings.gradle | 30 +- ios/Flutter/AppFrameworkInfo.plist | 2 +- ios/Podfile | 4 +- ios/Runner.xcodeproj/project.pbxproj | 7 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- lib/api.dart | 2 +- lib/app_colors.dart | 28 +- lib/barcode/barcode.dart | 51 +- lib/barcode/controller.dart | 9 +- lib/barcode/flutter_barcode_listener.dart | 175 ------ lib/barcode/stock.dart | 2 +- lib/barcode/wedge_controller.dart | 68 ++- lib/helpers.dart | 33 +- lib/inventree/sentry.dart | 21 +- lib/l10.dart | 19 +- lib/main.dart | 8 +- lib/preferences.dart | 1 - lib/widget/dialogs.dart | 14 +- lib/widget/snacks.dart | 2 +- lib/widget/stock/location_display.dart | 10 +- pubspec.lock | 549 +++++++++--------- pubspec.yaml | 26 +- test/wedge_scanner_test.dart | 2 +- 28 files changed, 519 insertions(+), 582 deletions(-) delete mode 100644 lib/barcode/flutter_barcode_listener.dart diff --git a/.github/workflows/android.yaml b/.github/workflows/android.yaml index 06992242..16c06b74 100644 --- a/.github/workflows/android.yaml +++ b/.github/workflows/android.yaml @@ -23,7 +23,7 @@ jobs: - name: Setup Flutter uses: subosito/flutter-action@v2 with: - flutter-version: '3.13.0' + flutter-version: '3.24.3' channel: 'stable' - run: flutter --version - name: Setup Gradle diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 889cad02..f5e5bcf8 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -36,7 +36,7 @@ jobs: - name: Setup Flutter uses: subosito/flutter-action@v2 with: - flutter-version: '3.13.0' + flutter-version: '3.24.3' - name: Collect Translation Files run: | cd lib/l10n diff --git a/.github/workflows/ios.yaml b/.github/workflows/ios.yaml index f6bf24b2..fc96cf0a 100644 --- a/.github/workflows/ios.yaml +++ b/.github/workflows/ios.yaml @@ -25,7 +25,7 @@ jobs: - name: Setup Flutter uses: subosito/flutter-action@v2 with: - flutter-version: '3.13.0' + flutter-version: '3.24.3' channel: 'stable' - name: Collect Translation Files run: | diff --git a/android/app/build.gradle b/android/app/build.gradle index c43c9bfc..a20b12b5 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,3 +1,9 @@ +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +} + def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { @@ -6,11 +12,6 @@ if (localPropertiesFile.exists()) { } } -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new FileNotFoundException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { flutterVersionCode = '1' @@ -21,10 +22,6 @@ if (flutterVersionName == null) { flutterVersionName = '1.0' } -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { @@ -85,5 +82,4 @@ dependencies { androidTestImplementation 'com.android.support:multidex:2.0.1' implementation "androidx.core:core:1.9.0" implementation 'androidx.appcompat:appcompat:1.6.0' - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" } diff --git a/android/build.gradle b/android/build.gradle index 5ace0515..346e5522 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,17 +1,3 @@ -buildscript { - - ext.kotlin_version = '1.8.10' - - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.4.1' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} allprojects { repositories { diff --git a/android/settings.gradle b/android/settings.gradle index 5a2f14fb..16ce3591 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,15 +1,25 @@ -include ':app' +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } + repositories { + google() + mavenCentral() + gradlePluginPortal() + } } -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.4.1" apply false + id "org.jetbrains.kotlin.android" version "1.8.10" apply false } + +include ":app" \ No newline at end of file diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 9625e105..7c569640 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 11.0 + 12.0 diff --git a/ios/Podfile b/ios/Podfile index 74fd5d31..1c050856 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your projects -platform :ios, '11.0' +platform :ios, '12.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' @@ -39,7 +39,7 @@ post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) target.build_configurations.each do |config| - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0' + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0' end end end diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index fbc94f10..3a6f42d2 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -92,6 +92,7 @@ 3B8B22940C363C2F0DDB698A /* Frameworks */, ); sourceTree = ""; + tabWidth = 5; }; 97C146EF1CF9000F007C117D /* Products */ = { isa = PBXGroup; @@ -167,7 +168,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 1430; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -271,11 +272,9 @@ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", "${BUILT_PRODUCTS_DIR}/DKImagePickerController/DKImagePickerController.framework", "${BUILT_PRODUCTS_DIR}/DKPhotoGallery/DKPhotoGallery.framework", - "${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework", "${BUILT_PRODUCTS_DIR}/MTBBarcodeScanner/MTBBarcodeScanner.framework", "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework", "${BUILT_PRODUCTS_DIR}/Sentry/Sentry.framework", - "${BUILT_PRODUCTS_DIR}/SentryPrivate/SentryPrivate.framework", "${BUILT_PRODUCTS_DIR}/SwiftyGif/SwiftyGif.framework", "${BUILT_PRODUCTS_DIR}/audioplayers_darwin/audioplayers_darwin.framework", "${BUILT_PRODUCTS_DIR}/camera_avfoundation/camera_avfoundation.framework", @@ -295,11 +294,9 @@ outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DKImagePickerController.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DKPhotoGallery.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FMDB.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MTBBarcodeScanner.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Sentry.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SentryPrivate.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyGif.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/audioplayers_darwin.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/camera_avfoundation.framework", diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index a6b826db..5e31d3d3 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ barcodeFailure(String msg, dynamic extra) async { msg, success: false, onAction: () { - OneContext().showDialog( - builder: (BuildContext context) => SimpleDialog( - title: Text(L10().barcodeError), - children: [ - ListTile( - title: Text(L10().responseData), - subtitle: Text(extra.toString()) - ) - ] - ) - ); + if (hasContext()) { + OneContext().showDialog( + builder: (BuildContext context) => + SimpleDialog( + title: Text(L10().barcodeError), + children: [ + ListTile( + title: Text(L10().responseData), + subtitle: Text(extra.toString()) + ) + ] + ) + ); + } } ); } @@ -277,17 +281,20 @@ class BarcodeScanHandler extends BarcodeHandler { success: false, onAction: () { - OneContext().showDialog( - builder: (BuildContext context) => SimpleDialog( - title: Text(L10().unknownResponse), - children: [ - ListTile( - title: Text(L10().responseData), - subtitle: Text(data.toString()), - ) - ], - ) - ); + if (hasContext()) { + OneContext().showDialog( + builder: (BuildContext context) => + SimpleDialog( + title: Text(L10().unknownResponse), + children: [ + ListTile( + title: Text(L10().responseData), + subtitle: Text(data.toString()), + ) + ], + ) + ); + } } ); } diff --git a/lib/barcode/controller.dart b/lib/barcode/controller.dart index ad17aa65..559bac9a 100644 --- a/lib/barcode/controller.dart +++ b/lib/barcode/controller.dart @@ -1,4 +1,5 @@ import "package:flutter/material.dart"; +import "package:inventree/helpers.dart"; import "package:one_context/one_context.dart"; import "package:inventree/preferences.dart"; @@ -43,7 +44,7 @@ class InvenTreeBarcodeControllerState extends State * Barcode data should be passed as a string */ Future handleBarcodeData(String? data) async { - + // Check that the data is valid, and this view is still mounted if (!mounted || data == null || data.isEmpty) { return; @@ -58,7 +59,11 @@ class InvenTreeBarcodeControllerState extends State processingBarcode = true; }); - BuildContext? context = OneContext.hasContext ? OneContext().context : null; + BuildContext? context; + + if (hasContext()) { + context = OneContext.hasContext ? OneContext().context : null; + } showLoadingOverlay(context); await pauseScan(); diff --git a/lib/barcode/flutter_barcode_listener.dart b/lib/barcode/flutter_barcode_listener.dart deleted file mode 100644 index c2b28450..00000000 --- a/lib/barcode/flutter_barcode_listener.dart +++ /dev/null @@ -1,175 +0,0 @@ - -/* - * Custom keyboard listener which allows the app to act as a keyboard "wedge", - * and intercept barcodes from any compatible scanner. - * - * Note: This code was copied from https://github.com/fuadreza/flutter_barcode_listener/blob/master/lib/flutter_barcode_listener.dart - * - * If that code becomes available on pub.dev, we can remove this file and reference that library - */ - -import "dart:async"; - -import "package:flutter/material.dart"; -import "package:flutter/services.dart"; - -typedef BarcodeScannedCallback = void Function(String barcode); - -/// This widget will listen for raw PHYSICAL keyboard events -/// even when other controls have primary focus. -/// It will buffer all characters coming in specifed `bufferDuration` time frame -/// that end with line feed character and call callback function with result. -/// Keep in mind this widget will listen for events even when not visible. -/// Windows seems to be using the [RawKeyDownEvent] instead of the -/// [RawKeyUpEvent], this behaviour can be managed by setting [useKeyDownEvent]. -class BarcodeKeyboardListener extends StatefulWidget { - - /// This widget will listen for raw PHYSICAL keyboard events - /// even when other controls have primary focus. - /// It will buffer all characters coming in specifed `bufferDuration` time frame - /// that end with line feed character and call callback function with result. - /// Keep in mind this widget will listen for events even when not visible. - const BarcodeKeyboardListener( - {Key? key, - - /// Child widget to be displayed. - required this.child, - - /// Callback to be called when barcode is scanned. - required Function(String) onBarcodeScanned, - - /// When experiencing issueswith empty barcodes on Windows, - /// set this value to true. Default value is `false`. - this.useKeyDownEvent = false, - - /// Maximum time between two key events. - /// If time between two key events is longer than this value - /// previous keys will be ignored. - Duration bufferDuration = hundredMs}) - : _onBarcodeScanned = onBarcodeScanned, - _bufferDuration = bufferDuration, - super(key: key); - - final Widget child; - final BarcodeScannedCallback _onBarcodeScanned; - final Duration _bufferDuration; - final bool useKeyDownEvent; - - @override - _BarcodeKeyboardListenerState createState() => _BarcodeKeyboardListenerState( - _onBarcodeScanned, _bufferDuration, useKeyDownEvent); -} - -const Duration aSecond = Duration(seconds: 1); -const Duration hundredMs = Duration(milliseconds: 100); -const String lineFeed = "\n"; - -class _BarcodeKeyboardListenerState extends State { - - _BarcodeKeyboardListenerState(this._onBarcodeScannedCallback, - this._bufferDuration, this._useKeyDownEvent) { - RawKeyboard.instance.addListener(_keyBoardCallback); - _keyboardSubscription = - _controller.stream.where((char) => char != null).listen(onKeyEvent); - } - - List _scannedChars = []; - DateTime? _lastScannedCharCodeTime; - late StreamSubscription _keyboardSubscription; - - final BarcodeScannedCallback _onBarcodeScannedCallback; - final Duration _bufferDuration; - - final _controller = StreamController(); - - final bool _useKeyDownEvent; - - bool _isShiftPressed = false; - void onKeyEvent(String? char) { - //remove any pending characters older than bufferDuration value - checkPendingCharCodesToClear(); - _lastScannedCharCodeTime = DateTime.now(); - if (char == lineFeed) { - _onBarcodeScannedCallback.call(_scannedChars.join()); - resetScannedCharCodes(); - } else { - //add character to list of scanned characters; - _scannedChars.add(char!); - } - } - - void checkPendingCharCodesToClear() { - if (_lastScannedCharCodeTime != null) { - if (_lastScannedCharCodeTime! - .isBefore(DateTime.now().subtract(_bufferDuration))) { - resetScannedCharCodes(); - } - } - } - - void resetScannedCharCodes() { - _lastScannedCharCodeTime = null; - _scannedChars = []; - } - - void addScannedCharCode(String charCode) { - _scannedChars.add(charCode); - } - - void _keyBoardCallback(RawKeyEvent keyEvent) { - if (keyEvent.logicalKey.keyId > 255 && - keyEvent.data.logicalKey != LogicalKeyboardKey.enter && - keyEvent.data.logicalKey != LogicalKeyboardKey.shiftLeft) return; - if ((!_useKeyDownEvent && keyEvent is RawKeyUpEvent) || - (_useKeyDownEvent && keyEvent is RawKeyDownEvent)) { - if (keyEvent.data is RawKeyEventDataAndroid) { - if (keyEvent.data.logicalKey == LogicalKeyboardKey.shiftLeft) { - _isShiftPressed = true; - } else { - if (_isShiftPressed) { - _isShiftPressed = false; - _controller.sink.add(String.fromCharCode( - ((keyEvent.data) as RawKeyEventDataAndroid).codePoint).toUpperCase()); - } else { - _controller.sink.add(String.fromCharCode( - ((keyEvent.data) as RawKeyEventDataAndroid).codePoint)); - } - } - } else if (keyEvent.data is RawKeyEventDataFuchsia) { - _controller.sink.add(String.fromCharCode( - ((keyEvent.data) as RawKeyEventDataFuchsia).codePoint)); - } else if (keyEvent.data.logicalKey == LogicalKeyboardKey.enter) { - _controller.sink.add(lineFeed); - } else if (keyEvent.data is RawKeyEventDataWeb) { - _controller.sink.add(((keyEvent.data) as RawKeyEventDataWeb).keyLabel); - } else if (keyEvent.data is RawKeyEventDataLinux) { - _controller.sink - .add(((keyEvent.data) as RawKeyEventDataLinux).keyLabel); - } else if (keyEvent.data is RawKeyEventDataWindows) { - _controller.sink.add(String.fromCharCode( - ((keyEvent.data) as RawKeyEventDataWindows).keyCode)); - } else if (keyEvent.data is RawKeyEventDataMacOs) { - _controller.sink - .add(((keyEvent.data) as RawKeyEventDataMacOs).characters); - } else if (keyEvent.data is RawKeyEventDataIos) { - _controller.sink - .add(((keyEvent.data) as RawKeyEventDataIos).characters); - } else { - _controller.sink.add(keyEvent.character); - } - } - } - - @override - Widget build(BuildContext context) { - return widget.child; - } - - @override - void dispose() { - _keyboardSubscription.cancel(); - _controller.close(); - RawKeyboard.instance.removeListener(_keyBoardCallback); - super.dispose(); - } -} \ No newline at end of file diff --git a/lib/barcode/stock.dart b/lib/barcode/stock.dart index b084759f..d2309010 100644 --- a/lib/barcode/stock.dart +++ b/lib/barcode/stock.dart @@ -42,7 +42,7 @@ class BarcodeScanStockLocationHandler extends BarcodeHandler { final bool result = await onLocationScanned(_loc); - if (result && OneContext.hasContext) { + if (result && hasContext()) { OneContext().pop(); } return; diff --git a/lib/barcode/wedge_controller.dart b/lib/barcode/wedge_controller.dart index b239c398..741cec16 100644 --- a/lib/barcode/wedge_controller.dart +++ b/lib/barcode/wedge_controller.dart @@ -1,11 +1,12 @@ import "package:flutter/material.dart"; +import "package:flutter/services.dart"; import "package:flutter_tabler_icons/flutter_tabler_icons.dart"; import "package:inventree/app_colors.dart"; import "package:inventree/barcode/controller.dart"; import "package:inventree/barcode/handler.dart"; -import "package:inventree/barcode/flutter_barcode_listener.dart"; + import "package:inventree/l10.dart"; import "package:inventree/helpers.dart"; @@ -31,6 +32,12 @@ class _WedgeBarcodeControllerState extends InvenTreeBarcodeControllerState { bool get scanning => mounted && canScan; + final FocusNode _focusNode = FocusNode(); + + List _scannedCharacters = []; + + DateTime? _lastScanTime; + @override Future pauseScan() async { @@ -51,6 +58,45 @@ class _WedgeBarcodeControllerState extends InvenTreeBarcodeControllerState { } } + // Callback for a single key press / scan + void handleKeyEvent(KeyEvent event) { + + if (!scanning) { + return; + } + + // Look only for key-down events + if (event is! KeyDownEvent) { + return; + } + + // Ignore events without a character code + if (event.character == null) { + return; + } + + DateTime now = DateTime.now(); + + // Throw away old characters + if (_lastScanTime == null || _lastScanTime!.isBefore(now.subtract(Duration(milliseconds: 250)))) { + _scannedCharacters.clear(); + } + + _lastScanTime = now; + + if (event.character == "\n") { + if (_scannedCharacters.isNotEmpty) { + // Debug output required for unit testing + debug("scanned: ${_scannedCharacters.join()}"); + handleBarcodeData(_scannedCharacters.join()); + } + + _scannedCharacters.clear(); + } else { + _scannedCharacters.add(event.character!); + } + } + @override Widget build(BuildContext context) { @@ -66,8 +112,9 @@ class _WedgeBarcodeControllerState extends InvenTreeBarcodeControllerState { Spacer(flex: 5), Icon(TablerIcons.barcode, size: 64), Spacer(flex: 5), - BarcodeKeyboardListener( - useKeyDownEvent: true, + KeyboardListener( + autofocus: true, + focusNode: _focusNode, child: SizedBox( child: CircularProgressIndicator( color: scanning ? COLOR_ACTION : COLOR_PROGRESS @@ -75,13 +122,16 @@ class _WedgeBarcodeControllerState extends InvenTreeBarcodeControllerState { width: 64, height: 64, ), - onBarcodeScanned: (String barcode) { - debug("scanned: ${barcode}"); - if (scanning) { - // Process the barcode data - handleBarcodeData(barcode); - } + onKeyEvent: (event) { + handleKeyEvent(event); }, + // onBarcodeScanned: (String barcode) { + // debug("scanned: ${barcode}"); + // if (scanning) { + // // Process the barcode data + // handleBarcodeData(barcode); + // } + // }, ), Spacer(flex: 5), Padding( diff --git a/lib/helpers.dart b/lib/helpers.dart index 49a880d1..993814f1 100644 --- a/lib/helpers.dart +++ b/lib/helpers.dart @@ -39,13 +39,32 @@ bool debugContains(String msg, {bool raiseAssert = true}) { } } + if (!result) { + print("Debug does not contain expected string: '${msg}'"); + } + if (raiseAssert) { + assert(result); } return result; } + +bool isTesting() { + return Platform.environment.containsKey("FLUTTER_TEST"); +} + +bool hasContext() { + try { + return !isTesting() && OneContext.hasContext; + } catch (error) { + return false; + } +} + + /* * Display a debug message if we are in testing mode, or running in debug mode */ @@ -83,7 +102,7 @@ Future playAudioFile(String path) async { // Debug message for unit testing debug("Playing audio file: '${path}'"); - if (!OneContext.hasContext) { + if (!hasContext()) { return; } @@ -117,21 +136,13 @@ String renderCurrency(double? amount, String currency, {int decimals = 2}) { if (currency.isEmpty) return "-"; - CurrencyFormatterSettings backupSettings = CurrencyFormatterSettings( - symbol: "\$", - symbolSide: SymbolSide.left, - ); + CurrencyFormat fmt = CurrencyFormat.fromCode(currency.toLowerCase()) ?? CurrencyFormat.usd; String value = CurrencyFormatter.format( amount, - CurrencyFormatter.majors[currency.toLowerCase()] ?? backupSettings + fmt ); - // If we were not able to determine the currency - if (!CurrencyFormatter.majors.containsKey(currency.toLowerCase())) { - value += " ${currency}"; - } - return value; } diff --git a/lib/inventree/sentry.dart b/lib/inventree/sentry.dart index 7484d71a..34894ff4 100644 --- a/lib/inventree/sentry.dart +++ b/lib/inventree/sentry.dart @@ -1,6 +1,7 @@ import "dart:io"; import "package:device_info_plus/device_info_plus.dart"; +import "package:inventree/helpers.dart"; import "package:one_context/one_context.dart"; import "package:package_info_plus/package_info_plus.dart"; import "package:sentry_flutter/sentry_flutter.dart"; @@ -129,16 +130,16 @@ Future sentryReportMessage(String message, {Map? context}) } Sentry.configureScope((scope) { - scope.setExtra("server", server_info); - scope.setExtra("app", app_info); - scope.setExtra("device", device_info); + scope.setContexts("server", server_info); + scope.setContexts("app", app_info); + scope.setContexts("device", device_info); if (context != null) { - scope.setExtra("context", context); + scope.setContexts("context", context); } // Catch stacktrace data if possible - scope.setExtra("stacktrace", StackTrace.current.toString()); + scope.setContexts("stacktrace", StackTrace.current.toString()); }); try { @@ -203,7 +204,7 @@ Future sentryReportError(String source, dynamic error, StackTrace? stackTr // Ensure we pass the 'source' of the error context["source"] = source; - if (OneContext.hasContext) { + if (hasContext()) { final ctx = OneContext().context; if (ctx != null) { @@ -213,10 +214,10 @@ Future sentryReportError(String source, dynamic error, StackTrace? stackTr } Sentry.configureScope((scope) { - scope.setExtra("server", server_info); - scope.setExtra("app", app_info); - scope.setExtra("device", device_info); - scope.setExtra("context", context); + scope.setContexts("server", server_info); + scope.setContexts("app", app_info); + scope.setContexts("device", device_info); + scope.setContexts("context", context); }); Sentry.captureException(error, stackTrace: stackTrace).catchError((error) { diff --git a/lib/l10.dart b/lib/l10.dart index 2b44f962..f5f6eece 100644 --- a/lib/l10.dart +++ b/lib/l10.dart @@ -4,18 +4,23 @@ import "package:flutter_gen/gen_l10n/app_localizations_en.dart"; import "package:one_context/one_context.dart"; import "package:flutter/material.dart"; +import "package:inventree/helpers.dart"; + // Shortcut function to reduce boilerplate! I18N L10() { - if (OneContext.hasContext) { - BuildContext? _ctx = OneContext().context; + // Testing mode - ignore context + if (!hasContext()) { + return I18NEn(); + } - if (_ctx != null) { - I18N? i18n = I18N.of(_ctx); + BuildContext? _ctx = OneContext().context; - if (i18n != null) { - return i18n; - } + if (_ctx != null) { + I18N? i18n = I18N.of(_ctx); + + if (i18n != null) { + return i18n; } } diff --git a/lib/main.dart b/lib/main.dart index 9359449e..545c8cdf 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -162,13 +162,13 @@ class InvenTreeAppState extends State { return AdaptiveTheme( light: ThemeData( brightness: Brightness.light, - primarySwatch: Colors.lightBlue, - secondaryHeaderColor: Colors.blueGrey + colorSchemeSeed: Colors.lightBlueAccent, + useMaterial3: true, ), dark: ThemeData( brightness: Brightness.dark, - primarySwatch: Colors.lightBlue, - secondaryHeaderColor: Colors.blueGrey, + colorSchemeSeed: Colors.blue, + useMaterial3: true, ), initial: savedThemeMode ?? AdaptiveThemeMode.light, builder: (light, dark) => MaterialApp( diff --git a/lib/preferences.dart b/lib/preferences.dart index 4828a7a8..2611418f 100644 --- a/lib/preferences.dart +++ b/lib/preferences.dart @@ -3,7 +3,6 @@ import "dart:ui"; import "package:inventree/l10n/supported_locales.dart"; import "package:path_provider/path_provider.dart"; -import "package:sembast/sembast.dart"; import "package:sembast/sembast_io.dart"; import "package:path/path.dart"; diff --git a/lib/widget/dialogs.dart b/lib/widget/dialogs.dart index a06609da..b4cb5a2f 100644 --- a/lib/widget/dialogs.dart +++ b/lib/widget/dialogs.dart @@ -31,6 +31,10 @@ Future choiceDialog(String title, List items, {Function? onSelecte ); } + if (!hasContext()) { + return; + } + OneContext().showDialog( builder: (BuildContext context) { return AlertDialog( @@ -63,6 +67,10 @@ Future confirmationDialog(String title, String text, {Color? color, IconDa String _accept = acceptText ?? L10().ok; String _reject = rejectText ?? L10().cancel; + if (!hasContext()) { + return; + } + OneContext().showDialog( builder: (BuildContext context) { return AlertDialog( @@ -176,6 +184,10 @@ Future showErrorDialog(String title, {String description = "", APIResponse } } + if (!hasContext()) { + return; + } + OneContext().showDialog( builder: (context) => SimpleDialog( title: ListTile( @@ -196,7 +208,7 @@ Future showErrorDialog(String title, {String description = "", APIResponse */ Future showServerError(String url, String title, String description) async { - if (!OneContext.hasContext) { + if (!hasContext()) { return; } diff --git a/lib/widget/snacks.dart b/lib/widget/snacks.dart index 66f5f152..c5a1aba8 100644 --- a/lib/widget/snacks.dart +++ b/lib/widget/snacks.dart @@ -13,7 +13,7 @@ void showSnackIcon(String text, {IconData? icon, Function()? onAction, bool? suc debug("showSnackIcon: '${text}'"); // Escape quickly if we do not have context - if (!OneContext.hasContext) { + if (!hasContext()) { // Debug message for unit testing return; } diff --git a/lib/widget/stock/location_display.dart b/lib/widget/stock/location_display.dart index 377325fe..df294739 100644 --- a/lib/widget/stock/location_display.dart +++ b/lib/widget/stock/location_display.dart @@ -301,12 +301,16 @@ class _LocationDisplayState extends RefreshableState { // Serial number field is not required here fields.remove("serial"); + Map data = {}; + + if (location != null) { + data["location"] = location!.pk; + } + InvenTreeStockItem().createForm( context, L10().stockItemCreate, - data: { - "location": location != null ? location!.pk : null, - }, + data: data, fields: fields, onSuccess: (result) async { Map data = result as Map; diff --git a/pubspec.lock b/pubspec.lock index 66a55bde..6cd6d6f9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,42 +5,47 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "0c80aeab9bc807ab10022cd3b2f4cf2ecdf231949dc1ddd9442406a003f19201" + sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 url: "https://pub.dev" source: hosted - version: "52.0.0" + version: "72.0.0" + _macros: + dependency: transitive + description: dart + source: sdk + version: "0.3.2" adaptive_theme: dependency: "direct main" description: name: adaptive_theme - sha256: "2d9bfee4240cdfad1b169cb43ac38fb49487e7fe1cc845e2973d4cef1780c0f6" + sha256: f4ee609b464e5efc68131d9d15ba9aa1de4e3b5ede64be17781c6e19a52d637d url: "https://pub.dev" source: hosted - version: "3.3.0" + version: "3.6.0" analyzer: dependency: transitive description: name: analyzer - sha256: cd8ee83568a77f3ae6b913a36093a1c9b1264e7cb7f834d9ddd2311dade9c1f4 + sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "6.7.0" archive: dependency: transitive description: name: archive - sha256: d6347d54a2d8028e0437e3c099f66fdb8ae02c4720c1e7534c9f24c10351f85d + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d url: "https://pub.dev" source: hosted - version: "3.3.6" + version: "3.6.1" args: dependency: transitive description: name: args - sha256: "139d809800a412ebb26a3892da228b2d0ba36f0ef5d9a82166e5e52ec8d61611" + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.5.0" async: dependency: transitive description: @@ -53,66 +58,66 @@ packages: dependency: "direct main" description: name: audioplayers - sha256: "61583554386721772f9309f509e17712865b38565a903c761f96b1115a979282" + sha256: c346ba5a39dc208f1bab55fc239855f573d69b0e832402114bf0b793622adc4d url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "6.1.0" audioplayers_android: dependency: transitive description: name: audioplayers_android - sha256: dbdc9b7f2aa2440314c638aa55aadd45c7705e8340d5eddf2e3fb8da32d4ae2c + sha256: de576b890befe27175c2f511ba8b742bec83765fa97c3ce4282bba46212f58e4 url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "5.0.0" audioplayers_darwin: dependency: transitive description: name: audioplayers_darwin - sha256: "6aea96df1d12f7ad5a71d88c6d1b22a216211a9564219920124c16768e456e9d" + sha256: e507887f3ff18d8e5a10a668d7bedc28206b12e10b98347797257c6ae1019c3b url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "6.0.0" audioplayers_linux: dependency: transitive description: name: audioplayers_linux - sha256: "396b62ac62c92dd26c3bc5106583747f57a8b325ebd2b41e5576f840cfc61338" + sha256: "3d3d244c90436115417f170426ce768856d8fe4dfc5ed66a049d2890acfa82f9" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "4.0.0" audioplayers_platform_interface: dependency: transitive description: name: audioplayers_platform_interface - sha256: f7daaed4659143094151ecf6bacd927d29ab8acffba98c110c59f0b81ae51143 + sha256: "6834dd48dfb7bc6c2404998ebdd161f79cd3774a7e6779e1348d54a3bfdcfaa5" url: "https://pub.dev" source: hosted - version: "5.0.1" + version: "7.0.0" audioplayers_web: dependency: transitive description: name: audioplayers_web - sha256: ec84fd46eed1577148ed4113f5998a36a18da4fce7170c37ce3e21b631393339 + sha256: "3609bdf0e05e66a3d9750ee40b1e37f2a622c4edb796cc600b53a90a30a2ace4" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "5.0.1" audioplayers_windows: dependency: transitive description: name: audioplayers_windows - sha256: "1d3aaac98a192b8488167711ba1e67d8b96333e8d0572ede4e2912e5bbce69a3" + sha256: "8605762dddba992138d476f6a0c3afd9df30ac5b96039929063eceed416795c2" url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "4.0.0" back_button_interceptor: dependency: transitive description: name: back_button_interceptor - sha256: e47660f2178a4392eb72001f9594d3fdcb5efde93e59d2819d61fda499e781c8 + sha256: "8354b03320043db546e3f446af171faaa71384100486444113628f7db1e7fe9b" url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "7.0.3" boolean_selector: dependency: transitive description: @@ -141,50 +146,50 @@ packages: dependency: transitive description: name: cached_network_image_web - sha256: "42a835caa27c220d1294311ac409a43361088625a4f23c820b006dd9bffb3316" + sha256: "205d6a9f1862de34b93184f22b9d2d94586b2f05c581d546695e3d8f6a805cd7" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" camera: dependency: "direct main" description: name: camera - sha256: e7ac55af24a890d20276821eb3c95857074d03b7de6f9892b99a205ee30bd179 + sha256: dfa8fc5a1adaeb95e7a54d86a5bd56f4bb0e035515354c8ac6d262e35cec2ec8 url: "https://pub.dev" source: hosted - version: "0.10.3" + version: "0.10.6" camera_android: dependency: transitive description: name: camera_android - sha256: e491c836147f60dd8a54cf3895fd2960e13b21b78a9d15b563a1b6c70894f142 + sha256: "32f04948a284b71d938fe275616faf4957d07f9b3aab8021bfc8c418301a289e" url: "https://pub.dev" source: hosted - version: "0.10.4" + version: "0.10.9+11" camera_avfoundation: dependency: transitive description: name: camera_avfoundation - sha256: "6a68c20593d4cd58974d555f74a48b244f9db28cc9156de57781122d11b8754b" + sha256: "7c28969a975a7eb2349bc2cb2dfe3ad218a33dba9968ecfb181ce08c87486655" url: "https://pub.dev" source: hosted - version: "0.9.11" + version: "0.9.17+3" camera_platform_interface: dependency: transitive description: name: camera_platform_interface - sha256: b632be28e61d00a233f67d98ea90fd7041956f27a1c65500188ee459be60e15f + sha256: b3ede1f171532e0d83111fe0980b46d17f1aa9788a07a2fbed07366bbdbb9061 url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.8.0" camera_web: dependency: transitive description: name: camera_web - sha256: "496de93c5d462738ce991dbfe91fb19026f115ed36406700a20a380fb0018299" + sha256: "595f28c89d1fb62d77c73c633193755b781c6d2e0ebcd8dc25b763b514e6ba8f" url: "https://pub.dev" source: hosted - version: "0.3.1+1" + version: "0.3.5" characters: dependency: transitive description: @@ -197,10 +202,10 @@ packages: dependency: transitive description: name: checked_yaml - sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.0.3" cli_util: dependency: transitive description: @@ -221,10 +226,10 @@ packages: dependency: transitive description: name: collection - sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.17.2" + version: "1.18.0" convert: dependency: transitive description: @@ -237,26 +242,26 @@ packages: dependency: transitive description: name: coverage - sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097" + sha256: c1fb2dce3c0085f39dc72668e85f8e0210ec7de05345821ff58530567df345a5 url: "https://pub.dev" source: hosted - version: "1.6.3" + version: "1.9.2" cross_file: dependency: transitive description: name: cross_file - sha256: "0b0036e8cccbfbe0555fd83c1d31a6f30b77a96b598b35a5d36dd41f718695e9" + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" url: "https://pub.dev" source: hosted - version: "0.3.3+4" + version: "0.3.4+2" crypto: dependency: transitive description: name: crypto - sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.5" cupertino_icons: dependency: "direct main" description: @@ -269,10 +274,10 @@ packages: dependency: "direct main" description: name: currency_formatter - sha256: "8fc2b612e465a4e886f5d8d3a7cec03cc3cabab617ef96bf54c70886c907f2c3" + sha256: "8d4e1762e226289e4abe902075d167029617553c913309b34a227c52c61dd063" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.2.1" datetime_picker_formfield: dependency: "direct main" description: @@ -285,18 +290,18 @@ packages: dependency: "direct main" description: name: device_info_plus - sha256: f52ab3b76b36ede4d135aab80194df8925b553686f0fa12226b4e2d658e45903 + sha256: a7fd703482b391a87d60b6061d04dfdeab07826b96f9abd8f5ed98068acc0074 url: "https://pub.dev" source: hosted - version: "8.2.2" + version: "10.1.2" device_info_plus_platform_interface: dependency: transitive description: name: device_info_plus_platform_interface - sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64 + sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba" url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "7.0.1" dropdown_search: dependency: "direct main" description: @@ -317,10 +322,10 @@ packages: dependency: transitive description: name: ffi - sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.3" file: dependency: transitive description: @@ -333,42 +338,42 @@ packages: dependency: "direct main" description: name: file_picker - sha256: "9d6e95ec73abbd31ec54d0e0df8a961017e165aba1395e462e5b31ea0c165daf" + sha256: "167bb619cdddaa10ef2907609feb8a79c16dfa479d3afaf960f8e223f754bf12" url: "https://pub.dev" source: hosted - version: "5.3.1" + version: "8.1.2" file_selector_linux: dependency: transitive description: name: file_selector_linux - sha256: "770eb1ab057b5ae4326d1c24cc57710758b9a46026349d021d6311bd27580046" + sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492" url: "https://pub.dev" source: hosted - version: "0.9.2" + version: "0.9.2+1" file_selector_macos: dependency: transitive description: name: file_selector_macos - sha256: "4ada532862917bf16e3adb3891fe3a5917a58bae03293e497082203a80909412" + sha256: cb284e267f8e2a45a904b5c094d2ba51d0aabfc20b1538ab786d9ef7dc2bf75c url: "https://pub.dev" source: hosted - version: "0.9.3+1" + version: "0.9.4+1" file_selector_platform_interface: dependency: transitive description: name: file_selector_platform_interface - sha256: "412705a646a0ae90f33f37acfae6a0f7cbc02222d6cd34e479421c3e74d3853c" + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.6.2" file_selector_windows: dependency: transitive description: name: file_selector_windows - sha256: "1372760c6b389842b77156203308940558a2817360154084368608413835fc26" + sha256: "2ad726953f6e8affbc4df8dc78b77c3b4a060967a291e528ef72ae846c60fb69" url: "https://pub.dev" source: hosted - version: "0.9.3" + version: "0.9.3+2" flutter: dependency: "direct main" description: flutter @@ -399,18 +404,18 @@ packages: dependency: "direct main" description: name: flutter_localized_locales - sha256: f219350dffcfd56692b4e41953710c2975888dd9c507d977ec6853d7ea140336 + sha256: "478d10535edf07292e34cb4c757882edeeaf96d5e3dbb04b42733038bd41dd3f" url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "2.0.5" flutter_markdown: dependency: "direct main" description: name: flutter_markdown - sha256: "21b085a1c185e46701373866144ced56cfb7a0c33f63c916bb8fe2d0c1491278" + sha256: "04c4722cc36ec5af38acc38ece70d22d3c2123c61305d555750a091517bbe504" url: "https://pub.dev" source: hosted - version: "0.6.19" + version: "0.6.23" flutter_overlay_loader: dependency: "direct main" description: @@ -423,10 +428,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "8ffe990dac54a4a5492747added38571a5ab474c8e5d196809ea08849c69b1bb" + sha256: "9ee02950848f61c4129af3d6ec84a1cfc0e47931abc746b03e7a3bc3e8ff6eda" url: "https://pub.dev" source: hosted - version: "2.0.13" + version: "2.0.22" flutter_speed_dial: dependency: "direct main" description: @@ -447,10 +452,10 @@ packages: dependency: "direct main" description: name: flutter_tabler_icons - sha256: a1dd0221ab8c77ee15046b8da8feac5ba129b5efd2b667e199c110cf930693b3 + sha256: "657c2201e12fa9121a12ddb4edb74d69290f803868eb6526f04102e6d49ec882" url: "https://pub.dev" source: hosted - version: "1.35.0" + version: "1.43.0" flutter_test: dependency: "direct dev" description: flutter @@ -465,26 +470,26 @@ packages: dependency: transitive description: name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "4.0.0" glob: dependency: transitive description: name: glob - sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" http: dependency: "direct main" description: name: http - sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 url: "https://pub.dev" source: hosted - version: "0.13.6" + version: "1.2.2" http_multi_server: dependency: transitive description: @@ -513,66 +518,66 @@ packages: dependency: "direct main" description: name: image_picker - sha256: "1f498d086203360cca099d20ffea2963f48c39ce91bdd8a3b6d4a045786b02c8" + sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" url: "https://pub.dev" source: hosted - version: "1.0.8" + version: "1.1.2" image_picker_android: dependency: transitive description: name: image_picker_android - sha256: "8179b54039b50eee561676232304f487602e2950ffb3e8995ed9034d6505ca34" + sha256: c0a6763d50b354793d0192afd0a12560b823147d3ded7c6b77daf658fa05cc85 url: "https://pub.dev" source: hosted - version: "0.8.7+4" + version: "0.8.12+13" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - sha256: "8b6c160cdbe572199103a091c783685b236110e4a0fd7a4947f32ff5b7da8765" + sha256: "65d94623e15372c5c51bebbcb820848d7bcb323836e12dfdba60b5d3a8b39e50" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.5" image_picker_ios: dependency: transitive description: name: image_picker_ios - sha256: fadafce49e8569257a0cad56d24438a6fa1f0cbd7ee0af9b631f7492818a4ca3 + sha256: "6703696ad49f5c3c8356d576d7ace84d1faf459afb07accbb0fae780753ff447" url: "https://pub.dev" source: hosted - version: "0.8.9+1" + version: "0.8.12" image_picker_linux: dependency: transitive description: name: image_picker_linux - sha256: "02cbc21fe1706b97942b575966e5fbbeaac535e76deef70d3a242e4afb857831" + sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa" url: "https://pub.dev" source: hosted - version: "0.2.1" + version: "0.2.1+1" image_picker_macos: dependency: transitive description: name: image_picker_macos - sha256: cee2aa86c56780c13af2c77b5f2f72973464db204569e1ba2dd744459a065af4 + sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62" url: "https://pub.dev" source: hosted - version: "0.2.1" + version: "0.2.1+1" image_picker_platform_interface: dependency: transitive description: name: image_picker_platform_interface - sha256: c1134543ae2187e85299996d21c526b2f403854994026d575ae4cf30d7bb2a32 + sha256: "9ec26d410ff46f483c5519c29c02ef0e02e13a543f882b152d4bfd2f06802f80" url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.10.0" image_picker_windows: dependency: transitive description: name: image_picker_windows - sha256: c3066601ea42113922232c7b7b3330a2d86f029f685bba99d82c30e799914952 + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" url: "https://pub.dev" source: hosted - version: "0.2.1" + version: "0.2.1+1" infinite_scroll_pagination: dependency: "direct main" description: @@ -585,10 +590,10 @@ packages: dependency: "direct main" description: name: intl - sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf url: "https://pub.dev" source: hosted - version: "0.18.1" + version: "0.19.0" io: dependency: transitive description: @@ -609,98 +614,130 @@ packages: dependency: transitive description: name: json_annotation - sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.8.0" + version: "4.9.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + url: "https://pub.dev" + source: hosted + version: "10.0.5" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + url: "https://pub.dev" + source: hosted + version: "3.0.5" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" lint: dependency: "direct dev" description: name: lint - sha256: f4bd4dbaa39f4ae8836f2d1275f2f32bc68b3a8cce0a0735dd1f7a601f06682a + sha256: d758a5211fce7fd3f5e316f804daefecdc34c7e53559716125e6da7388ae8565 url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.3.0" logging: dependency: transitive description: name: logging - sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" + macros: + dependency: transitive + description: + name: macros + sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" + url: "https://pub.dev" + source: hosted + version: "0.1.2-main.4" markdown: dependency: transitive description: name: markdown - sha256: "1b134d9f8ff2da15cb298efe6cd8b7d2a78958c1b00384ebcbdf13fe340a6c90" + sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051 url: "https://pub.dev" source: hosted - version: "7.2.1" + version: "7.2.2" matcher: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.15.0" mime: dependency: transitive description: name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.0.6" node_preamble: dependency: transitive description: name: node_preamble - sha256: "8ebdbaa3b96d5285d068f80772390d27c21e1fa10fb2df6627b1b9415043608d" + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.2" octo_image: dependency: transitive description: name: octo_image - sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d" + sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" one_context: dependency: "direct main" description: name: one_context - sha256: db39c05e68a0f8dabb68072eab31e21912a5f4933db24eabc2b1af8a02d221e2 + sha256: "40607e6cf85d95dc81ee037788857a943784d37dfc04a40904a140328745e0af" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "4.0.0" open_filex: dependency: "direct main" description: name: open_filex - sha256: "74e2280754cf8161e860746c3181db2c996d6c1909c7057b738ede4a469816b8" + sha256: ba425ea49affd0a98a234aa9344b9ea5d4c4f7625a1377961eae9fe194c3d523 url: "https://pub.dev" source: hosted - version: "4.4.0" + version: "4.5.0" package_config: dependency: transitive description: @@ -713,50 +750,50 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: "10259b111176fba5c505b102e3a5b022b51dd97e30522e906d6922c745584745" + sha256: a75164ade98cb7d24cfd0a13c6408927c6b217fa60dee5a7ff5c116a58f28918 url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "8.0.2" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" + sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66 url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.1" path: dependency: "direct main" description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" path_provider: dependency: "direct main" description: name: path_provider - sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "51f0d2c554cfbc9d6a312ab35152fc77e2f0b758ce9f1a444a3a1e5b8f3c6b7f" + sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7" url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.2.10" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.0" path_provider_linux: dependency: transitive description: @@ -769,50 +806,42 @@ packages: dependency: transitive description: name: path_provider_platform_interface - sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c" + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" path_provider_windows: dependency: transitive description: name: path_provider_windows - sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.0" petitparser: dependency: transitive description: name: petitparser - sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "6.0.2" platform: dependency: transitive description: name: platform - sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.5" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" url: "https://pub.dev" source: hosted - version: "2.1.4" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346 - url: "https://pub.dev" - source: hosted - version: "3.6.2" + version: "2.1.8" pool: dependency: transitive description: @@ -821,22 +850,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.1" - process: - dependency: transitive - description: - name: process - sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" - url: "https://pub.dev" - source: hosted - version: "4.2.4" pub_semver: dependency: transitive description: name: pub_semver - sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" qr_code_scanner: dependency: "direct main" description: @@ -845,14 +866,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" - quiver: - dependency: transitive - description: - name: quiver - sha256: b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47 - url: "https://pub.dev" - source: hosted - version: "3.2.1" rxdart: dependency: transitive description: @@ -865,114 +878,114 @@ packages: dependency: "direct main" description: name: sembast - sha256: "9a9f0c7aca07043fef857b8b365f41592e48832b61462292699b57978e241c11" + sha256: "934a7b99297fb4f0b6e69fb1465286737b3b47b1a5149bf8dfc85667fbbdd21d" url: "https://pub.dev" source: hosted - version: "3.6.0" + version: "3.7.4+3" sentry: dependency: transitive description: name: sentry - sha256: "39c23342fc96105da449914f7774139a17a0ca8a4e70d9ad5200171f7e47d6ba" + sha256: "033287044a6644a93498969449d57c37907e56f5cedb17b88a3ff20a882261dd" url: "https://pub.dev" source: hosted - version: "7.9.0" + version: "8.9.0" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: ff68ab31918690da004a42e20204242a3ad9ad57da7e2712da8487060ac9767f + sha256: "3780b5a0bb6afd476857cfbc6c7444d969c29a4d9bd1aa5b6960aa76c65b737a" url: "https://pub.dev" source: hosted - version: "7.9.0" + version: "8.9.0" shared_preferences: dependency: transitive description: name: shared_preferences - sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 + sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051" url: "https://pub.dev" source: hosted - version: "2.2.3" + version: "2.3.2" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" + sha256: "480ba4345773f56acda9abf5f50bd966f581dac5d514e5fc4a18c62976bbba7e" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.2" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" + sha256: c4b35f6cb8f63c147312c054ce7c2254c8066745125264f0c88739c417fc9d9f url: "https://pub.dev" source: hosted - version: "2.3.5" + version: "2.5.2" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.4.1" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf + sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.4.2" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" shelf: dependency: transitive description: name: shelf - sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" shelf_packages_handler: dependency: transitive description: name: shelf_packages_handler - sha256: aef74dc9195746a384843102142ab65b6a4735bb3beea791e63527b88cc83306 + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" shelf_static: dependency: transitive description: name: shelf_static - sha256: e792b76b96a36d4a41b819da593aff4bdd413576b3ba6150df5d8d9996d2e74c + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.3" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 + sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611" url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "2.0.0" sky_engine: dependency: transitive description: flutter @@ -990,18 +1003,18 @@ packages: dependency: transitive description: name: source_map_stack_trace - sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" source_maps: dependency: transitive description: name: source_maps - sha256: "490098075234dcedb83c5d949b4c93dad5e6b7702748de000be2b57b8e6b2427" + sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" url: "https://pub.dev" source: hosted - version: "0.10.11" + version: "0.10.12" source_span: dependency: transitive description: @@ -1014,34 +1027,34 @@ packages: dependency: transitive description: name: sqflite - sha256: "78324387dc81df14f78df06019175a86a2ee0437624166c382e145d0a7fd9a4f" + sha256: ff5a2436ef8ebdfda748fbfe957f9981524cb5ff11e7bafa8c42771840e8a788 url: "https://pub.dev" source: hosted - version: "2.2.4+1" + version: "2.3.3+2" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: bfd6973aaeeb93475bc0d875ac9aefddf7965ef22ce09790eb963992ffc5183f + sha256: "2d8e607db72e9cb7748c9c6e739e2c9618320a5517de693d5a24609c4671b1a4" url: "https://pub.dev" source: hosted - version: "2.4.2+2" + version: "2.5.4+4" stack_trace: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.11.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" stream_transform: dependency: transitive description: @@ -1062,10 +1075,10 @@ packages: dependency: transitive description: name: synchronized - sha256: "33b31b6beb98100bf9add464a36a8dd03eb10c7a8cf15aeec535e9b054aaf04b" + sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.3.0+3" term_glyph: dependency: transitive description: @@ -1078,106 +1091,98 @@ packages: dependency: "direct dev" description: name: test - sha256: "13b41f318e2a5751c3169137103b60c584297353d4b1761b66029bae6411fe46" + sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" url: "https://pub.dev" source: hosted - version: "1.24.3" + version: "1.25.7" test_api: dependency: transitive description: name: test_api - sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.6.0" + version: "0.7.2" test_core: dependency: transitive description: name: test_core - sha256: "99806e9e6d95c7b059b7a0fc08f07fc53fabe54a829497f0d9676299f1e8637e" + sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" url: "https://pub.dev" source: hosted - version: "0.5.3" + version: "0.6.4" typed_data: dependency: transitive description: name: typed_data - sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c url: "https://pub.dev" source: hosted - version: "1.3.1" - universal_io: - dependency: transitive - description: - name: universal_io - sha256: "06866290206d196064fd61df4c7aea1ffe9a4e7c4ccaa8fcded42dd41948005d" - url: "https://pub.dev" - source: hosted - version: "2.2.0" + version: "1.3.2" url_launcher: dependency: "direct main" description: name: url_launcher - sha256: c512655380d241a337521703af62d2c122bf7b77a46ff7dd750092aa9433499c + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" url: "https://pub.dev" source: hosted - version: "6.2.4" + version: "6.3.0" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "507dc655b1d9cb5ebc756032eb785f114e415f91557b73bf60b7e201dfedeb2f" + sha256: e35a698ac302dd68e41f73250bd9517fe3ab5fa4f18fe4647a0872db61bacbab url: "https://pub.dev" source: hosted - version: "6.2.2" + version: "6.3.10" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "75bb6fe3f60070407704282a2d295630cab232991eb52542b18347a8a941df03" + sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e url: "https://pub.dev" source: hosted - version: "6.2.4" + version: "6.3.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 + sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.2.0" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" + sha256: "769549c999acdb42b8bcfa7c43d72bf79a382ca7441ab18a808e101149daf672" url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.2.1" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - sha256: "4aca1e060978e19b2998ee28503f40b5ba6226819c2b5e3e4d1821e8ccd92198" + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.3.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "7fd2f55fe86cea2897b963e864dc01a7eb0719ecc65fcef4c1cc3d686d718bb2" + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.3" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" uuid: dependency: transitive description: @@ -1198,74 +1203,90 @@ packages: dependency: transitive description: name: vm_service - sha256: e7fb6c2282f7631712b69c19d1bff82f3767eea33a2321c14fa59ad67ea391c7 + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "9.4.0" + version: "14.2.5" watcher: dependency: transitive description: name: watcher - sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.0" web: dependency: transitive description: name: web - sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb url: "https://pub.dev" source: hosted - version: "0.1.4-beta" + version: "1.1.0" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + url: "https://pub.dev" + source: hosted + version: "0.1.6" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b + sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "3.0.1" webkit_inspection_protocol: dependency: transitive description: name: webkit_inspection_protocol - sha256: "67d3a8b6c79e1987d19d848b0892e582dbb0c66c57cc1fef58a177dd2aa2823d" + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" win32: dependency: transitive description: name: win32 - sha256: dd8f9344bc305ae2923e3d11a2a911d9a4e2c7dd6fe0ed10626d63211a69676e + sha256: "68d1e89a91ed61ad9c370f9f8b6effed9ae5e0ede22a270bdfa6daf79fc2290a" url: "https://pub.dev" source: hosted - version: "4.1.3" + version: "5.5.4" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852" + url: "https://pub.dev" + source: hosted + version: "1.1.5" xdg_directories: dependency: transitive description: name: xdg_directories - sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86 + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d url: "https://pub.dev" source: hosted - version: "0.2.0+3" + version: "1.0.4" xml: dependency: transitive description: name: xml - sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5" + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 url: "https://pub.dev" source: hosted - version: "6.2.2" + version: "6.5.0" yaml: dependency: transitive description: name: yaml - sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" sdks: - dart: ">=3.1.0 <3.13.0" - flutter: ">=3.13.0" + dart: ">=3.5.0 <3.13.0" + flutter: ">=3.24.0" diff --git a/pubspec.yaml b/pubspec.yaml index 9c07d459..0d175208 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,15 +8,15 @@ environment: dependencies: adaptive_theme: ^3.3.0 # Theme management (e.g. dark mode) - audioplayers: ^4.1.0 # Play audio files + audioplayers: ^6.1.0 # Play audio files cached_network_image: ^3.3.1 # Download and cache remote images camera: ^0.10.3 # Camera cupertino_icons: ^1.0.8 - currency_formatter: ^2.0.1 + currency_formatter: ^2.2.1 # Currency formatting datetime_picker_formfield: ^2.0.1 # Date / time picker - device_info_plus: ^8.2.2 # Information about the device + device_info_plus: ^10.1.2 # Information about the device dropdown_search: ^5.0.6 # Dropdown autocomplete form fields - file_picker: ^5.3.1 # Select files from the device + file_picker: ^8.1.2 # Select files from the device flutter: sdk: flutter flutter_cache_manager: ^3.3.0 @@ -27,19 +27,19 @@ dependencies: flutter_overlay_loader: ^2.0.0 # Overlay screen support flutter_speed_dial: ^6.2.0 # Speed dial / FAB implementation flutter_tabler_icons: ^1.35.0 - http: ^0.13.6 - image_picker: ^1.0.8 # Select or take photos + http: ^1.2.2 + image_picker: ^1.1.2 # Select or take photos infinite_scroll_pagination: ^4.0.0 # Let the server do all the work! - intl: ^0.18.0 - one_context: ^2.1.0 # Dialogs without requiring context - open_filex: ^4.4.0 # Open local files - package_info_plus: ^3.0.2 # App information introspection - path: ^1.8.2 + intl: ^0.19.0 + one_context: ^4.0.0 # Dialogs without requiring context + open_filex: ^4.5.0 # Open local files + package_info_plus: ^8.0.2 # App information introspection + path: ^1.9.0 path_provider: ^2.1.3 # Local file storage qr_code_scanner: ^1.0.1 # Barcode scanning sembast: ^3.6.0 # NoSQL data storage - sentry_flutter: 7.9.0 # Error reporting - url_launcher: ^6.2.4 # Open link in system browser + sentry_flutter: 8.9.0 # Error reporting + url_launcher: ^6.3.0 # Open link in system browser dev_dependencies: flutter_launcher_icons: ^0.11.0 diff --git a/test/wedge_scanner_test.dart b/test/wedge_scanner_test.dart index c46f127a..8cdca593 100644 --- a/test/wedge_scanner_test.dart +++ b/test/wedge_scanner_test.dart @@ -21,7 +21,7 @@ void main() { await simulateKeyDownEvent(LogicalKeyboardKey.keyA); await simulateKeyDownEvent(LogicalKeyboardKey.keyB); await simulateKeyDownEvent(LogicalKeyboardKey.keyC); - await simulateKeyDownEvent(LogicalKeyboardKey.enter); + await simulateKeyDownEvent(LogicalKeyboardKey.enter, character: "\n"); // Check debug output debugContains("scanned: abc");