diff --git a/.github/workflows/android.yaml b/.github/workflows/android.yaml index abd2b882..f462ba4b 100644 --- a/.github/workflows/android.yaml +++ b/.github/workflows/android.yaml @@ -15,8 +15,6 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v3 - with: - submodules: recursive - name: Setup Java uses: actions/setup-java@v3 with: @@ -25,9 +23,11 @@ jobs: - name: Setup Flutter uses: subosito/flutter-action@v2 with: - flutter-version: '3.7.3' + flutter-version: '3.10.4' + channel: 'stable' + - run: flutter --version - name: Setup Gradle - uses: gradle/gradle-build-action@v2 + uses: gradle/gradle-build-action@v2.4.2 with: gradle-version: 7.6 - name: Collect Translation Files @@ -36,6 +36,7 @@ jobs: python3 collect_translations.py - name: Build for Android run: | + flutter upgrade flutter pub get cp lib/dummy_dsn.dart lib/dsn.dart flutter build apk --debug diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index bc3be9c3..dc848cd3 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -39,13 +39,14 @@ jobs: - name: Setup Flutter uses: subosito/flutter-action@v2 with: - flutter-version: '3.7.3' + flutter-version: '3.10.4' - name: Collect Translation Files run: | cd lib/l10n python3 collect_translations.py - name: Static Analysis Tests run: | + flutter upgrade cp lib/dummy_dsn.dart lib/dsn.dart python3 find_dart_files.py flutter pub get diff --git a/analysis_options.yaml b/analysis_options.yaml index 5e388c21..217d3d29 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -6,8 +6,6 @@ analyzer: - lib/generated/** language: strict-raw-types: true - strong-mode: - implicit-casts: false linter: rules: @@ -21,6 +19,8 @@ linter: prefer_double_quotes: true + unreachable_from_main: false + prefer_final_locals: false prefer_const_constructors: false @@ -76,4 +76,6 @@ linter: avoid_classes_with_only_static_members: false - no_leading_underscores_for_local_identifiers: false \ No newline at end of file + no_leading_underscores_for_local_identifiers: false + + use_super_parameters: false diff --git a/android/build.gradle b/android/build.gradle index a5b45642..5ace0515 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -29,6 +29,6 @@ subprojects { } } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/lib/api.dart b/lib/api.dart index fdb1fbcd..7a707dfe 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -80,6 +80,26 @@ class APIResponse { return []; } } + + /* + * Helper function to interpret response, and return a list. + * Handles case where the response is paginated, or a complete set of results + */ + List resultsList() { + + if (isList()) { + return asList(); + } else if (isMap()) { + var response = asMap(); + if (response.containsKey("results")) { + return response["results"] as List; + } else { + return []; + } + } else { + return []; + } + } } diff --git a/lib/api_form.dart b/lib/api_form.dart index f8d82e07..80e20f67 100644 --- a/lib/api_form.dart +++ b/lib/api_form.dart @@ -538,13 +538,7 @@ class APIFormField { final APIResponse response = await InvenTreeAPI().get(api_url, params: _filters); if (response.isValid()) { - List results = []; - - for (var result in response.data["results"] ?? []) { - results.add(result); - } - - return results; + return response.resultsList(); } else { return []; } @@ -1334,10 +1328,10 @@ class _APIFormWidgetState extends State { // Ensure the response is a valid JSON structure Map json = {}; - if (response.data != null && response.data is Map) { - for (dynamic key in response.data.keys) { - json[key.toString()] = response.data[key]; - } + var data = response.asMap(); + + for (String key in data.keys) { + json[key.toString()] = data[key]; } successFunc(json); diff --git a/lib/inventree/model.dart b/lib/inventree/model.dart index 97b2f162..abb7ec6b 100644 --- a/lib/inventree/model.dart +++ b/lib/inventree/model.dart @@ -726,7 +726,9 @@ class InvenTreeModel { page.results = []; - for (var result in response.data["results"]) { + List results = dataMap["results"] as List; + + for (dynamic result in results) { page.addResult(createFromJson(result as Map)); } diff --git a/lib/widget/dialogs.dart b/lib/widget/dialogs.dart index 398dea65..280c0e90 100644 --- a/lib/widget/dialogs.dart +++ b/lib/widget/dialogs.dart @@ -79,7 +79,8 @@ Future showErrorDialog(String title, {String description = "", APIResponse switch (response.statusCode) { case 400: // Bad request (typically bad input) if (response.data is Map) { - for (String field in response.data.keys) { + + for (String field in response.asMap().keys) { dynamic error = response.data[field]; diff --git a/lib/widget/stock_detail.dart b/lib/widget/stock_detail.dart index 37077f19..4deeaba4 100644 --- a/lib/widget/stock_detail.dart +++ b/lib/widget/stock_detail.dart @@ -280,7 +280,8 @@ class _StockItemDisplayState extends RefreshableState { }, ).then((APIResponse response) { if (response.isValid() && response.statusCode == 200) { - for (var label in response.data) { + + for (var label in response.resultsList()) { if (label is Map) { labels.add(label); } diff --git a/pubspec.lock b/pubspec.lock index d890c9eb..8141e718 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -13,10 +13,10 @@ packages: dependency: "direct main" description: name: adaptive_theme - sha256: "61bde10390e937d11d05c6cf0d5cf378a73d49f9a442262e43613dae60ed0b3f" + sha256: "2d9bfee4240cdfad1b169cb43ac38fb49487e7fe1cc845e2973d4cef1780c0f6" url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.3.0" analyzer: dependency: transitive description: @@ -45,66 +45,66 @@ packages: dependency: transitive description: name: async - sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" url: "https://pub.dev" source: hosted - version: "2.10.0" + version: "2.11.0" audioplayers: dependency: "direct main" description: name: audioplayers - sha256: "16451eab798b23ad9307aef6f9ca62bb8fb06542af8810eead0d236d3fd40a42" + sha256: "61583554386721772f9309f509e17712865b38565a903c761f96b1115a979282" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "4.1.0" audioplayers_android: dependency: transitive description: name: audioplayers_android - sha256: b2c833e6f718b6b030454e329931229afafe9327fdb002874dd544dc8bf2484d + sha256: dbdc9b7f2aa2440314c638aa55aadd45c7705e8340d5eddf2e3fb8da32d4ae2c url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "3.0.2" audioplayers_darwin: dependency: transitive description: name: audioplayers_darwin - sha256: e7a3c8759bf11ecfe4b20df338bf9f3d37c7719a5761c46a3833aba0ceeaacff + sha256: "6aea96df1d12f7ad5a71d88c6d1b22a216211a9564219920124c16768e456e9d" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "4.1.0" audioplayers_linux: dependency: transitive description: name: audioplayers_linux - sha256: e95b65e1f4d4764601dac5e65f8d8186fc29401043ab020f1dacec483d708707 + sha256: "396b62ac62c92dd26c3bc5106583747f57a8b325ebd2b41e5576f840cfc61338" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "2.1.0" audioplayers_platform_interface: dependency: transitive description: name: audioplayers_platform_interface - sha256: "178581a44cb685fd798d2108111d2e98cca3400e30b9c3a05546f124fb37f600" + sha256: f7daaed4659143094151ecf6bacd927d29ab8acffba98c110c59f0b81ae51143 url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "5.0.1" audioplayers_web: dependency: transitive description: name: audioplayers_web - sha256: "859ba09be2a57e57a787273f18c8cf0d9b61383870c5ee4b5632fe9adbc37edf" + sha256: ec84fd46eed1577148ed4113f5998a36a18da4fce7170c37ce3e21b631393339 url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "3.1.0" audioplayers_windows: dependency: transitive description: name: audioplayers_windows - sha256: "622e01c4c357c2aaf1b956c3a0f89d97c3cb40315c03f16e3b6c2a31ff9c38bc" + sha256: "1d3aaac98a192b8488167711ba1e67d8b96333e8d0572ede4e2912e5bbce69a3" url: "https://pub.dev" source: hosted - version: "1.1.3" + version: "2.0.2" back_button_interceptor: dependency: transitive description: @@ -189,10 +189,10 @@ packages: dependency: transitive description: name: characters - sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.3.0" checked_yaml: dependency: transitive description: @@ -221,10 +221,10 @@ packages: dependency: transitive description: name: collection - sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" url: "https://pub.dev" source: hosted - version: "1.17.0" + version: "1.17.1" convert: dependency: transitive description: @@ -269,10 +269,10 @@ packages: dependency: "direct main" description: name: currency_formatter - sha256: "24034a969f21a55071b1cf835655c1fb1fd94e3acd498a77283e945002591fb6" + sha256: "8fc2b612e465a4e886f5d8d3a7cec03cc3cabab617ef96bf54c70886c907f2c3" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" datetime_picker_formfield: dependency: "direct main" description: @@ -529,10 +529,10 @@ packages: dependency: "direct main" description: name: intl - sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6 url: "https://pub.dev" source: hosted - version: "0.17.0" + version: "0.18.0" io: dependency: transitive description: @@ -545,10 +545,10 @@ packages: dependency: transitive description: name: js - sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 url: "https://pub.dev" source: hosted - version: "0.6.5" + version: "0.6.7" json_annotation: dependency: transitive description: @@ -561,10 +561,10 @@ packages: dependency: "direct dev" description: name: lint - sha256: "3e9343b1cededcfb1e8b40d0dbd3592b7a1c6c0121545663a991433390c2bc97" + sha256: f4bd4dbaa39f4ae8836f2d1275f2f32bc68b3a8cce0a0735dd1f7a601f06682a url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.2" logging: dependency: transitive description: @@ -585,10 +585,10 @@ packages: dependency: transitive description: name: matcher - sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" url: "https://pub.dev" source: hosted - version: "0.12.13" + version: "0.12.15" material_color_utilities: dependency: transitive description: @@ -601,10 +601,10 @@ packages: dependency: transitive description: name: meta - sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.9.1" mime: dependency: transitive description: @@ -673,10 +673,10 @@ packages: dependency: "direct main" description: name: path - sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" url: "https://pub.dev" source: hosted - version: "1.8.2" + version: "1.8.3" path_provider: dependency: "direct main" description: @@ -817,26 +817,26 @@ packages: dependency: "direct main" description: name: sembast - sha256: "4997717aa84f0622691815d7e2739988b7f7d3a463302fc878f7d5acfa748e96" + sha256: "3875487075df740e3ed0817571c950f015e5f730ff84fa0351849bf002fb4e1b" url: "https://pub.dev" source: hosted - version: "3.4.0+6" + version: "3.4.6+1" sentry: dependency: transitive description: name: sentry - sha256: cce8f5d696c7083e6915477b455de2134b689aff69bc31249844646f91a52ac7 + sha256: "0316390446c6497664379b3d72d1bc1b6e4c5385cf6c1f6a02c5ab5a3ce179ce" url: "https://pub.dev" source: hosted - version: "7.5.0" + version: "7.7.0" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: a772ad8abafdcf4ac04568bf3469cc541761412fd664a7aa99d9578fd0933a09 + sha256: cca6f3bcfa00d327d85424a42e4cc3b3abe25e6a2d68c4ff64b0e2a606684666 url: "https://pub.dev" source: hosted - version: "7.5.0" + version: "7.7.0" shared_preferences: dependency: transitive description: @@ -1030,26 +1030,26 @@ packages: dependency: "direct dev" description: name: test - sha256: a5fcd2d25eeadbb6589e80198a47d6a464ba3e2049da473943b8af9797900c2d + sha256: "3dac9aecf2c3991d09b9cdde4f98ded7b30804a88a0d7e4e7e1678e78d6b97f4" url: "https://pub.dev" source: hosted - version: "1.22.0" + version: "1.24.1" test_api: dependency: transitive description: name: test_api - sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb url: "https://pub.dev" source: hosted - version: "0.4.16" + version: "0.5.1" test_core: dependency: transitive description: name: test_core - sha256: "0ef9755ec6d746951ba0aabe62f874b707690b5ede0fecc818b138fcc9b14888" + sha256: "5138dbffb77b2289ecb12b81c11ba46036590b72a64a7a90d6ffb880f1a29e93" url: "https://pub.dev" source: hosted - version: "0.4.20" + version: "0.5.1" typed_data: dependency: transitive description: @@ -1211,5 +1211,5 @@ packages: source: hosted version: "3.1.1" sdks: - dart: ">=2.18.0 <3.0.0" - flutter: ">=3.3.0" + dart: ">=3.0.0 <4.0.0" + flutter: ">=3.10.0" diff --git a/pubspec.yaml b/pubspec.yaml index d0040891..cde9b93c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,15 +4,15 @@ description: InvenTree stock management version: 0.12.1+67 environment: - sdk: ">=2.16.0 <3.0.0" + sdk: ">=2.19.5 <3.0.0" dependencies: - adaptive_theme: ^3.2.0 # Theme management (e.g. dark mode) - audioplayers: ^3.0.1 # Play audio files + adaptive_theme: ^3.3.0 # Theme management (e.g. dark mode) + audioplayers: ^4.1.0 # Play audio files cached_network_image: ^3.2.3 # Download and cache remote images camera: ^0.10.3 # Camera cupertino_icons: ^1.0.3 - currency_formatter: ^2.0.0 + currency_formatter: ^2.0.1 datetime_picker_formfield: ^2.0.1 # Date / time picker device_info_plus: ^8.2.2 # Information about the device dropdown_search: ^5.0.6 # Dropdown autocomplete form fields @@ -20,7 +20,7 @@ dependencies: flutter: sdk: flutter flutter_cache_manager: ^3.3.0 - flutter_localizations: + flutter_localizations: sdk: flutter flutter_localized_locales: ^2.0.4 flutter_markdown: ^0.6.13+1 # Rendering markdown @@ -30,22 +30,22 @@ dependencies: http: ^0.13.5 image_picker: ^0.8.7+4 # Select or take photos infinite_scroll_pagination: ^3.2.0 # Let the server do all the work! - intl: ^0.17.0 + intl: ^0.18.0 one_context: ^2.1.0 # Dialogs without requiring context open_filex: ^4.3.2 # Open local files package_info_plus: ^3.0.2 # App information introspection path: ^1.8.2 path_provider: ^2.0.12 # Local file storage qr_code_scanner: ^1.0.1 # Barcode scanning - sembast: ^3.4.0+6 # NoSQL data storage - sentry_flutter: ^7.5.0 # Error reporting - url_launcher: ^6.1.10 # Open link in system browser + sembast: ^3.4.6+1 # NoSQL data storage + sentry_flutter: ^7.7.0 # Error reporting + url_launcher: ^6.1.10 # Open link in system browser dev_dependencies: flutter_launcher_icons: ^0.11.0 flutter_test: sdk: flutter - lint: ^2.0.1 + lint: ^2.1.2 test: ^1.22.0 flutter_icons: diff --git a/test/setup.dart b/test/setup.dart index c4b53879..1338f132 100644 --- a/test/setup.dart +++ b/test/setup.dart @@ -15,7 +15,7 @@ void setupTestEnv() { // Mock the path provider const MethodChannel channel = MethodChannel("plugins.flutter.io/path_provider"); - TestDefaultBinaryMessengerBinding.instance?.defaultBinaryMessenger + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger .setMockMethodCallHandler(channel, (MethodCall methodCall) async { return "."; });