From e98d7febddcae1c5f0f84b78c2f58c41fc41ad54 Mon Sep 17 00:00:00 2001 From: edde746 <86283021+edde746@users.noreply.github.com> Date: Mon, 18 May 2026 22:52:51 +0200 Subject: [PATCH] chore: upgrade Flutter to 3.44 --- .github/workflows/build.yml | 16 +-- .github/workflows/ci.yml | 8 +- android/gradle.properties | 4 + build.yaml | 2 + ios/Podfile.lock | 94 ------------------ ios/Runner.xcodeproj/project.pbxproj | 18 ++++ .../xcshareddata/swiftpm/Package.resolved | 74 +++++++++++++- .../xcshareddata/xcschemes/Runner.xcscheme | 18 ++++ .../xcshareddata/swiftpm/Package.resolved | 74 +++++++++++++- lib/i18n/strings.g.dart | 2 - lib/screens/downloads/sync_rules_screen.dart | 55 ++++++----- lib/screens/libraries/libraries_screen.dart | 98 +++++++++---------- .../livetv/reorder_favorites_sheet.dart | 91 ++++++++--------- .../playlist/playlist_detail_screen.dart | 7 +- .../screens/watch_together_screen.dart | 27 ++--- macos/Podfile.lock | 91 ----------------- macos/Runner.xcodeproj/project.pbxproj | 18 ++++ .../xcshareddata/swiftpm/Package.resolved | 20 +++- .../xcshareddata/xcschemes/Runner.xcscheme | 18 ++++ .../xcshareddata/swiftpm/Package.resolved | 20 +++- pubspec.lock | 12 +-- pubspec.yaml | 4 +- scripts/codegen.sh | 1 + slang.yaml | 1 + 24 files changed, 414 insertions(+), 359 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e39ba1a8..83caa526 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -29,7 +29,7 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: "3.41.9" + flutter-version: "3.44.0" cache: true pub-cache: false @@ -113,7 +113,7 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: "3.41.9" + flutter-version: "3.44.0" cache: true pub-cache: false @@ -178,7 +178,7 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: "3.41.9" + flutter-version: "3.44.0" cache: true pub-cache: false @@ -347,7 +347,7 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: "3.41.9" + flutter-version: "3.44.0" cache: true pub-cache: false @@ -407,7 +407,8 @@ jobs: - name: Setup Flutter uses: subosito/flutter-action@v2 with: - channel: "master" + channel: "stable" + flutter-version: "3.44.0" cache: true pub-cache: false @@ -534,7 +535,7 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: "3.41.9" + flutter-version: "3.44.0" cache: true pub-cache: false @@ -648,7 +649,8 @@ jobs: - name: Setup Flutter uses: subosito/flutter-action@v2 with: - channel: "master" + channel: "stable" + flutter-version: "3.44.0" cache: true pub-cache: false diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c675b05c..e51eb1c0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: "3.41.9" + flutter-version: "3.44.0" cache: true pub-cache: false @@ -41,7 +41,7 @@ jobs: - name: Verify generated files committed run: | - dart run build_runner build --delete-conflicting-outputs + scripts/codegen.sh if ! git diff --exit-code lib/; then echo "::error::Generated files (.g.dart / .freezed.dart) are out of date." echo "Run 'scripts/codegen.sh' and commit the result." @@ -115,7 +115,7 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: "3.41.9" + flutter-version: "3.44.0" cache: true pub-cache: false @@ -170,7 +170,7 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" - flutter-version: "3.41.9" + flutter-version: "3.44.0" cache: true pub-cache: false diff --git a/android/gradle.properties b/android/gradle.properties index f018a618..475a6280 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,7 @@ org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true +# This builtInKotlin flag was added automatically by Flutter migrator +android.builtInKotlin=false +# This newDsl flag was added automatically by Flutter migrator +android.newDsl=false diff --git a/build.yaml b/build.yaml index e3837c51..d745f204 100644 --- a/build.yaml +++ b/build.yaml @@ -13,3 +13,5 @@ targets: copy_with: true equal: true to_string: true + slang_build_runner: + enabled: false diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 58230274..915208b1 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,128 +1,34 @@ PODS: - - background_downloader (0.0.1): - - Flutter - - connectivity_plus (0.0.1): - - Flutter - cupertino_http (0.0.1): - Flutter - FlutterMacOS - - device_info_plus (0.0.1): - - Flutter - - file_picker (0.0.1): - - Flutter - Flutter (1.0.0) - os_media_controls (0.2.1): - Flutter - - package_info_plus (0.4.5): - - Flutter - - Sentry/HybridSDK (8.58.0) - - sentry_flutter (9.16.0): - - Flutter - - FlutterMacOS - - Sentry/HybridSDK (= 8.58.0) - - shared_preferences_foundation (0.0.1): - - Flutter - - FlutterMacOS - - sqlite3 (3.52.0): - - sqlite3/common (= 3.52.0) - - sqlite3/common (3.52.0) - - sqlite3/dbstatvtab (3.52.0): - - sqlite3/common - - sqlite3/fts5 (3.52.0): - - sqlite3/common - - sqlite3/math (3.52.0): - - sqlite3/common - - sqlite3/perf-threadsafe (3.52.0): - - sqlite3/common - - sqlite3/rtree (3.52.0): - - sqlite3/common - - sqlite3/session (3.52.0): - - sqlite3/common - - sqlite3_flutter_libs (0.0.1): - - Flutter - - FlutterMacOS - - sqlite3 (~> 3.52.0) - - sqlite3/dbstatvtab - - sqlite3/fts5 - - sqlite3/math - - sqlite3/perf-threadsafe - - sqlite3/rtree - - sqlite3/session - universal_gamepad (0.1.0): - Flutter - - url_launcher_ios (0.0.1): - - Flutter - - wakelock_plus (0.0.1): - - Flutter DEPENDENCIES: - - background_downloader (from `.symlinks/plugins/background_downloader/ios`) - - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) - cupertino_http (from `.symlinks/plugins/cupertino_http/darwin`) - - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - - file_picker (from `.symlinks/plugins/file_picker/ios`) - Flutter (from `Flutter`) - os_media_controls (from `.symlinks/plugins/os_media_controls/ios`) - - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - - sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`) - - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - - sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/darwin`) - universal_gamepad (from `.symlinks/plugins/universal_gamepad/ios`) - - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - - wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`) - -SPEC REPOS: - trunk: - - Sentry - - sqlite3 EXTERNAL SOURCES: - background_downloader: - :path: ".symlinks/plugins/background_downloader/ios" - connectivity_plus: - :path: ".symlinks/plugins/connectivity_plus/ios" cupertino_http: :path: ".symlinks/plugins/cupertino_http/darwin" - device_info_plus: - :path: ".symlinks/plugins/device_info_plus/ios" - file_picker: - :path: ".symlinks/plugins/file_picker/ios" Flutter: :path: Flutter os_media_controls: :path: ".symlinks/plugins/os_media_controls/ios" - package_info_plus: - :path: ".symlinks/plugins/package_info_plus/ios" - sentry_flutter: - :path: ".symlinks/plugins/sentry_flutter/ios" - shared_preferences_foundation: - :path: ".symlinks/plugins/shared_preferences_foundation/darwin" - sqlite3_flutter_libs: - :path: ".symlinks/plugins/sqlite3_flutter_libs/darwin" universal_gamepad: :path: ".symlinks/plugins/universal_gamepad/ios" - url_launcher_ios: - :path: ".symlinks/plugins/url_launcher_ios/ios" - wakelock_plus: - :path: ".symlinks/plugins/wakelock_plus/ios" SPEC CHECKSUMS: - background_downloader: 50e91d979067b82081aba359d7d916b3ba5fadad - connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd cupertino_http: 94ac07f5ff090b8effa6c5e2c47871d48ab7c86c - device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe - file_picker: 8fc6fe5e42585a217d44d22f79ec046cb8d81140 Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 os_media_controls: 3b06fe2dc0977dfa94f9c1dd73df7a55022d202f - package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 - Sentry: d587a8fe91ca13503ecd69a1905f3e8a0fcf61be - sentry_flutter: 31101687061fb85211ebab09ce6eb8db4e9ba74f - shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb - sqlite3: a51c07cf16e023d6c48abd5e5791a61a47354921 - sqlite3_flutter_libs: b3e120efe9a82017e5552a620f696589ed4f62ab universal_gamepad: 838bbb70d37d8c7c719038aa397214f2c4c4f866 - url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b - wakelock_plus: 5aaa6a7ccaf4749a96a7d8ff0721d68061ad62cf PODFILE CHECKSUM: 16bb7f67e16d8aaa2bfb97666803fbfb291b6559 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 96fec70c..52be1b66 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -23,6 +23,7 @@ B1D51A6A2F00110000000001 /* MpvPlayerCoreBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D51A6A2F00110000000002 /* MpvPlayerCoreBase.swift */; }; B1D51A6A2F00110000000005 /* MpvPlayerPluginShared.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D51A6A2F00110000000006 /* MpvPlayerPluginShared.swift */; }; B1D51A6A2F00110000000008 /* ExternalDisplayManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D51A6A2F00110000000007 /* ExternalDisplayManager.swift */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -78,6 +79,7 @@ BB346A1D0705AB171F80B11B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DE48FF2E074644167608B23D /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; F3553CDE70191F0FC81A782E /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -93,6 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, 6A8A46212EDB320D0057B88C /* MPVKit in Frameworks */, 69E1B4BB161DC9D84D1DFC62 /* Pods_Runner.framework in Frameworks */, ); @@ -147,6 +150,7 @@ 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, @@ -215,6 +219,9 @@ productType = "com.apple.product-type.bundle.unit-test"; }; 97C146ED1CF9000F007C117D /* Runner */ = { + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( @@ -266,6 +273,7 @@ ); mainGroup = 97C146E51CF9000F007C117D; packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, 6A8A461F2EDB320D0057B88C /* XCRemoteSwiftPackageReference "MPVKit" */, ); productRefGroup = 97C146EF1CF9000F007C117D /* Products */; @@ -792,7 +800,17 @@ package = 6A8A461F2EDB320D0057B88C /* XCRemoteSwiftPackageReference "MPVKit" */; productName = MPVKit; }; + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; /* End XCSwiftPackageProductDependency section */ +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; } diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index d7b95e99..6376f191 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,6 +1,40 @@ { - "originHash" : "c535d3cdb62bd4e11e67f3c9e68290fa7ee9306634c5f56d2b0396eb75ed41ee", "pins" : [ + { + "identity" : "csqlite", + "kind" : "remoteSourceControl", + "location" : "https://github.com/simolus3/CSQLite.git", + "state" : { + "revision" : "1ee46d19a4f451a7aa64ffc64fc99b4748131e62" + } + }, + { + "identity" : "dkcamera", + "kind" : "remoteSourceControl", + "location" : "https://github.com/zhangao0086/DKCamera", + "state" : { + "branch" : "master", + "revision" : "5c691d11014b910aff69f960475d70e65d9dcc96" + } + }, + { + "identity" : "dkimagepickercontroller", + "kind" : "remoteSourceControl", + "location" : "https://github.com/zhangao0086/DKImagePickerController", + "state" : { + "branch" : "4.3.9", + "revision" : "0bdfeacefa308545adde07bef86e349186335915" + } + }, + { + "identity" : "dkphotogallery", + "kind" : "remoteSourceControl", + "location" : "https://github.com/zhangao0086/DKPhotoGallery", + "state" : { + "branch" : "master", + "revision" : "311c1bc7a94f1538f82773a79c84374b12a2ef3d" + } + }, { "identity" : "mpvkit", "kind" : "remoteSourceControl", @@ -8,7 +42,43 @@ "state" : { "revision" : "45ff446b369d388457781e09371a356111a4faee" } + }, + { + "identity" : "sdwebimage", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SDWebImage/SDWebImage", + "state" : { + "revision" : "2de3a496eaf6df9a1312862adcfd54acd73c39c0", + "version" : "5.21.7" + } + }, + { + "identity" : "sentry-cocoa", + "kind" : "remoteSourceControl", + "location" : "https://github.com/getsentry/sentry-cocoa", + "state" : { + "revision" : "16cd512711375fa73f25ae5e373f596bdf4251ae", + "version" : "8.58.0" + } + }, + { + "identity" : "swiftygif", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kirualex/SwiftyGif.git", + "state" : { + "revision" : "4430cbc148baa3907651d40562d96325426f409a", + "version" : "5.4.5" + } + }, + { + "identity" : "tocropviewcontroller", + "kind" : "remoteSourceControl", + "location" : "https://github.com/TimOliver/TOCropViewController", + "state" : { + "revision" : "d4a6d8100f4b886fdbc8ae399bf144ff3e9afb7e", + "version" : "2.8.0" + } } ], - "version" : 3 + "version" : 2 } diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index e3773d42..c3fedb29 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -5,6 +5,24 @@ + + + + + + + + + + { borderRadius: 12, onSelect: () => _onTap(context), onNavigateRight: () => _switchFocusNode.requestFocus(), - child: ListTile( - dense: true, - visualDensity: const VisualDensity(vertical: -3), - shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(12))), - leading: Icon(_leadingIcon(), color: rule.enabled ? Colors.teal : null, size: 20), - title: Text(title, maxLines: 1, overflow: TextOverflow.ellipsis), - subtitle: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text(_subtitle(), maxLines: 1, overflow: TextOverflow.ellipsis), - Text(serverLine, maxLines: 1, overflow: TextOverflow.ellipsis), - ], - ), - trailing: FocusableWrapper( - focusNode: _switchFocusNode, - disableScale: true, - useBackgroundFocus: true, - descendantsAreFocusable: false, - borderRadius: 20, - onSelect: () => downloadProvider.setSyncRuleEnabled(rule.globalKey, !rule.enabled), - onNavigateLeft: () => _rowFocusNode.requestFocus(), - child: Switch( - value: rule.enabled, - onChanged: (value) => downloadProvider.setSyncRuleEnabled(rule.globalKey, value), + child: Material( + type: MaterialType.transparency, + child: ListTile( + dense: true, + visualDensity: const VisualDensity(vertical: -3), + shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(12))), + leading: Icon(_leadingIcon(), color: rule.enabled ? Colors.teal : null, size: 20), + title: Text(title, maxLines: 1, overflow: TextOverflow.ellipsis), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text(_subtitle(), maxLines: 1, overflow: TextOverflow.ellipsis), + Text(serverLine, maxLines: 1, overflow: TextOverflow.ellipsis), + ], ), + trailing: FocusableWrapper( + focusNode: _switchFocusNode, + disableScale: true, + useBackgroundFocus: true, + descendantsAreFocusable: false, + borderRadius: 20, + onSelect: () => downloadProvider.setSyncRuleEnabled(rule.globalKey, !rule.enabled), + onNavigateLeft: () => _rowFocusNode.requestFocus(), + child: Switch( + value: rule.enabled, + onChanged: (value) => downloadProvider.setSyncRuleEnabled(rule.globalKey, value), + ), + ), + onTap: () => _onTap(context), ), - onTap: () => _onTap(context), ), ), ), diff --git a/lib/screens/libraries/libraries_screen.dart b/lib/screens/libraries/libraries_screen.dart index 02489579..06580def 100644 --- a/lib/screens/libraries/libraries_screen.dart +++ b/lib/screens/libraries/libraries_screen.dart @@ -1416,9 +1416,6 @@ class _LibraryManagementSheetState extends State<_LibraryManagementSheet> { void _reorderLibraries(int oldIndex, int newIndex) { setState(() { - if (newIndex > oldIndex) { - newIndex -= 1; - } final library = _tempLibraries.removeAt(oldIndex); _tempLibraries.insert(newIndex, library); }); @@ -1560,7 +1557,7 @@ class _LibraryManagementSheetState extends State<_LibraryManagementSheet> { return ReorderableListView.builder( scrollController: _dialogScrollController, - onReorder: _reorderLibraries, + onReorderItem: _reorderLibraries, itemCount: _tempLibraries.length, padding: const EdgeInsets.symmetric(vertical: 8), buildDefaultDragHandles: false, @@ -1590,7 +1587,7 @@ class _LibraryManagementSheetState extends State<_LibraryManagementSheet> { return ReorderableListView.builder( scrollController: scrollController, - onReorder: _reorderLibraries, + onReorderItem: _reorderLibraries, itemCount: _tempLibraries.length, padding: const EdgeInsets.symmetric(vertical: 8), buildDefaultDragHandles: false, @@ -1641,58 +1638,53 @@ class _LibraryManagementSheetState extends State<_LibraryManagementSheet> { return Opacity( key: ValueKey(library.globalKey), opacity: isHidden ? 0.5 : 1.0, - child: Container( - decoration: BoxDecoration(color: tileColor), - child: ListTile( - leading: Row( - mainAxisSize: MainAxisSize.min, - children: [ - ReorderableDragStartListener( - index: index, - child: AppIcon( - isMoving ? Symbols.swap_vert_rounded : Symbols.drag_indicator_rounded, - fill: 1, - color: isMoving ? colorScheme.primary : IconTheme.of(context).color?.withValues(alpha: 0.5), - ), + child: ListTile( + tileColor: tileColor, + leading: Row( + mainAxisSize: MainAxisSize.min, + children: [ + ReorderableDragStartListener( + index: index, + child: AppIcon( + isMoving ? Symbols.swap_vert_rounded : Symbols.drag_indicator_rounded, + fill: 1, + color: isMoving ? colorScheme.primary : IconTheme.of(context).color?.withValues(alpha: 0.5), ), - const SizedBox(width: 8), - AppIcon(ContentTypeHelper.getLibraryIcon(library.kind.id), fill: 1), - ], - ), - title: Text(library.title), - subtitle: showServerName - ? Text( - library.serverName!, - style: TextStyle( - fontSize: 11, - color: Theme.of(context).textTheme.bodySmall?.color?.withValues(alpha: 0.6), - ), - ) - : null, - trailing: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - decoration: FocusTheme.focusBackgroundDecoration( - isFocused: isVisibilityButtonFocused, - borderRadius: 20, - ), - child: IconButton( - icon: AppIcon(isHidden ? Symbols.visibility_off_rounded : Symbols.visibility_rounded, fill: 1), - tooltip: isHidden ? t.libraries.showLibrary : t.libraries.hideLibrary, - onPressed: () => widget.onToggleVisibility(library), + ), + const SizedBox(width: 8), + AppIcon(ContentTypeHelper.getLibraryIcon(library.kind.id), fill: 1), + ], + ), + title: Text(library.title), + subtitle: showServerName + ? Text( + library.serverName!, + style: TextStyle( + fontSize: 11, + color: Theme.of(context).textTheme.bodySmall?.color?.withValues(alpha: 0.6), ), + ) + : null, + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + decoration: FocusTheme.focusBackgroundDecoration(isFocused: isVisibilityButtonFocused, borderRadius: 20), + child: IconButton( + icon: AppIcon(isHidden ? Symbols.visibility_off_rounded : Symbols.visibility_rounded, fill: 1), + tooltip: isHidden ? t.libraries.showLibrary : t.libraries.hideLibrary, + onPressed: () => widget.onToggleVisibility(library), ), - Container( - decoration: FocusTheme.focusBackgroundDecoration(isFocused: isOptionsButtonFocused, borderRadius: 20), - child: IconButton( - icon: const AppIcon(Symbols.more_vert_rounded, fill: 1), - tooltip: t.libraries.libraryOptions, - onPressed: () => _showLibraryMenuBottomSheet(context, library), - ), + ), + Container( + decoration: FocusTheme.focusBackgroundDecoration(isFocused: isOptionsButtonFocused, borderRadius: 20), + child: IconButton( + icon: const AppIcon(Symbols.more_vert_rounded, fill: 1), + tooltip: t.libraries.libraryOptions, + onPressed: () => _showLibraryMenuBottomSheet(context, library), ), - ], - ), + ), + ], ), ), ); diff --git a/lib/screens/livetv/reorder_favorites_sheet.dart b/lib/screens/livetv/reorder_favorites_sheet.dart index b20b2bc0..06621098 100644 --- a/lib/screens/livetv/reorder_favorites_sheet.dart +++ b/lib/screens/livetv/reorder_favorites_sheet.dart @@ -194,9 +194,6 @@ class _ReorderFavoritesSheetState extends State { void _onReorder(int oldIndex, int newIndex) { setState(() { - if (newIndex > oldIndex) { - newIndex -= 1; - } final item = _tempFavorites.removeAt(oldIndex); _tempFavorites.insert(newIndex, item); }); @@ -233,7 +230,7 @@ class _ReorderFavoritesSheetState extends State { onKeyEvent: _handleKeyEvent, child: ReorderableListView.builder( scrollController: _scrollController, - onReorder: _onReorder, + onReorderItem: _onReorder, itemCount: _tempFavorites.length, padding: const EdgeInsets.symmetric(vertical: 8), buildDefaultDragHandles: false, @@ -284,53 +281,51 @@ class _ReorderFavoritesSheetState extends State { final displayName = channel?.displayName ?? fav.title ?? fav.id; final channelNumber = channel?.number ?? fav.vcn; - return Container( + return ListTile( key: key, - decoration: BoxDecoration(color: tileColor), - child: ListTile( - leading: Row( - mainAxisSize: MainAxisSize.min, - children: [ - ReorderableDragStartListener( - index: index, - child: AppIcon( - isMoving ? Symbols.swap_vert_rounded : Symbols.drag_indicator_rounded, - fill: 1, - color: isMoving ? colorScheme.primary : IconTheme.of(context).color?.withValues(alpha: 0.5), - ), + tileColor: tileColor, + leading: Row( + mainAxisSize: MainAxisSize.min, + children: [ + ReorderableDragStartListener( + index: index, + child: AppIcon( + isMoving ? Symbols.swap_vert_rounded : Symbols.drag_indicator_rounded, + fill: 1, + color: isMoving ? colorScheme.primary : IconTheme.of(context).color?.withValues(alpha: 0.5), ), - const SizedBox(width: 8), - SizedBox( - width: 40, - height: 40, - child: channel?.thumb != null && client != null - ? OptimizedMediaImage.thumb( - client: client, - imagePath: channel!.thumb, - width: 40, - height: 40, - fit: BoxFit.contain, - ) - : Center(child: AppIcon(Symbols.live_tv_rounded, fill: 1, color: colorScheme.onSurfaceVariant)), - ), - ], - ), - title: Text(displayName, maxLines: 1, overflow: TextOverflow.ellipsis), - subtitle: channelNumber != null - ? Text( - channelNumber, - style: TextStyle( - fontSize: 11, - color: Theme.of(context).textTheme.bodySmall?.color?.withValues(alpha: 0.6), - ), - ) - : null, - trailing: Container( - decoration: FocusTheme.focusBackgroundDecoration(isFocused: isRemoveButtonFocused, borderRadius: 20), - child: IconButton( - icon: const AppIcon(Symbols.close_rounded, fill: 1, size: 20), - onPressed: () => _removeItem(index), ), + const SizedBox(width: 8), + SizedBox( + width: 40, + height: 40, + child: channel?.thumb != null && client != null + ? OptimizedMediaImage.thumb( + client: client, + imagePath: channel!.thumb, + width: 40, + height: 40, + fit: BoxFit.contain, + ) + : Center(child: AppIcon(Symbols.live_tv_rounded, fill: 1, color: colorScheme.onSurfaceVariant)), + ), + ], + ), + title: Text(displayName, maxLines: 1, overflow: TextOverflow.ellipsis), + subtitle: channelNumber != null + ? Text( + channelNumber, + style: TextStyle( + fontSize: 11, + color: Theme.of(context).textTheme.bodySmall?.color?.withValues(alpha: 0.6), + ), + ) + : null, + trailing: Container( + decoration: FocusTheme.focusBackgroundDecoration(isFocused: isRemoveButtonFocused, borderRadius: 20), + child: IconButton( + icon: const AppIcon(Symbols.close_rounded, fill: 1, size: 20), + onPressed: () => _removeItem(index), ), ), ); diff --git a/lib/screens/playlist/playlist_detail_screen.dart b/lib/screens/playlist/playlist_detail_screen.dart index 5d0cc2e1..be970c8f 100644 --- a/lib/screens/playlist/playlist_detail_screen.dart +++ b/lib/screens/playlist/playlist_detail_screen.dart @@ -373,11 +373,6 @@ class _PlaylistDetailScreenState extends BaseMediaListDetailScreen _onReorder(int oldIndex, int newIndex) async { if (!_canEditPlaylist) return; - // Adjust newIndex if moving down in the list - if (newIndex > oldIndex) { - newIndex--; - } - // Can't reorder if indices are the same if (oldIndex == newIndex) return; @@ -780,7 +775,7 @@ class _PlaylistDetailScreenState extends BaseMediaListDetailScreen _showActions(context), - child: ListTile( - shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(12))), - leading: isEntering ? const LoadingIndicatorBox(size: 24) : const Icon(Symbols.meeting_room_rounded), - title: Text(title, maxLines: 1, overflow: TextOverflow.ellipsis), - subtitle: room.name != null - ? Text( - room.code, - style: TextStyle(fontFamily: 'monospace', color: theme.colorScheme.onSurfaceVariant), - ) - : null, - trailing: IconButton(icon: const Icon(Symbols.more_vert_rounded), onPressed: () => _showActions(context)), - onTap: isBusy ? null : onTap, + child: Material( + type: MaterialType.transparency, + child: ListTile( + shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(12))), + leading: isEntering ? const LoadingIndicatorBox(size: 24) : const Icon(Symbols.meeting_room_rounded), + title: Text(title, maxLines: 1, overflow: TextOverflow.ellipsis), + subtitle: room.name != null + ? Text( + room.code, + style: TextStyle(fontFamily: 'monospace', color: theme.colorScheme.onSurfaceVariant), + ) + : null, + trailing: IconButton(icon: const Icon(Symbols.more_vert_rounded), onPressed: () => _showActions(context)), + onTap: isBusy ? null : onTap, + ), ), ), ); diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 969b3033..8778f1d5 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -2,143 +2,52 @@ PODS: - auto_updater_macos (0.0.1): - FlutterMacOS - Sparkle - - connectivity_plus (0.0.1): - - FlutterMacOS - cupertino_http (0.0.1): - Flutter - FlutterMacOS - - device_info_plus (0.0.1): - - FlutterMacOS - - file_picker (0.0.1): - - FlutterMacOS - FlutterMacOS (1.0.0) - os_media_controls (0.2.1): - FlutterMacOS - - package_info_plus (0.0.1): - - FlutterMacOS - screen_retriever_macos (0.0.1): - FlutterMacOS - - Sentry/HybridSDK (8.58.0) - - sentry_flutter (9.16.0): - - Flutter - - FlutterMacOS - - Sentry/HybridSDK (= 8.58.0) - - shared_preferences_foundation (0.0.1): - - Flutter - - FlutterMacOS - Sparkle (2.9.0) - - sqlite3 (3.52.0): - - sqlite3/common (= 3.52.0) - - sqlite3/common (3.52.0) - - sqlite3/dbstatvtab (3.52.0): - - sqlite3/common - - sqlite3/fts5 (3.52.0): - - sqlite3/common - - sqlite3/math (3.52.0): - - sqlite3/common - - sqlite3/perf-threadsafe (3.52.0): - - sqlite3/common - - sqlite3/rtree (3.52.0): - - sqlite3/common - - sqlite3/session (3.52.0): - - sqlite3/common - - sqlite3_flutter_libs (0.0.1): - - Flutter - - FlutterMacOS - - sqlite3 (~> 3.52.0) - - sqlite3/dbstatvtab - - sqlite3/fts5 - - sqlite3/math - - sqlite3/perf-threadsafe - - sqlite3/rtree - - sqlite3/session - universal_gamepad (0.1.0): - FlutterMacOS - - url_launcher_macos (0.0.1): - - FlutterMacOS - - wakelock_plus (0.0.1): - - FlutterMacOS - - window_manager (0.5.0): - - FlutterMacOS DEPENDENCIES: - auto_updater_macos (from `Flutter/ephemeral/.symlinks/plugins/auto_updater_macos/macos`) - - connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos`) - cupertino_http (from `Flutter/ephemeral/.symlinks/plugins/cupertino_http/darwin`) - - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) - - file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/macos`) - FlutterMacOS (from `Flutter/ephemeral`) - os_media_controls (from `Flutter/ephemeral/.symlinks/plugins/os_media_controls/macos`) - - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) - screen_retriever_macos (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos`) - - sentry_flutter (from `Flutter/ephemeral/.symlinks/plugins/sentry_flutter/macos`) - - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) - - sqlite3_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/darwin`) - universal_gamepad (from `Flutter/ephemeral/.symlinks/plugins/universal_gamepad/macos`) - - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) - - wakelock_plus (from `Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos`) - - window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`) SPEC REPOS: trunk: - - Sentry - Sparkle - - sqlite3 EXTERNAL SOURCES: auto_updater_macos: :path: Flutter/ephemeral/.symlinks/plugins/auto_updater_macos/macos - connectivity_plus: - :path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos cupertino_http: :path: Flutter/ephemeral/.symlinks/plugins/cupertino_http/darwin - device_info_plus: - :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos - file_picker: - :path: Flutter/ephemeral/.symlinks/plugins/file_picker/macos FlutterMacOS: :path: Flutter/ephemeral os_media_controls: :path: Flutter/ephemeral/.symlinks/plugins/os_media_controls/macos - package_info_plus: - :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos screen_retriever_macos: :path: Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos - sentry_flutter: - :path: Flutter/ephemeral/.symlinks/plugins/sentry_flutter/macos - shared_preferences_foundation: - :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin - sqlite3_flutter_libs: - :path: Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/darwin universal_gamepad: :path: Flutter/ephemeral/.symlinks/plugins/universal_gamepad/macos - url_launcher_macos: - :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos - wakelock_plus: - :path: Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos - window_manager: - :path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos SPEC CHECKSUMS: auto_updater_macos: 3a42f1a06be6981f1a18be37e6e7bf86aa732118 - connectivity_plus: 4adf20a405e25b42b9c9f87feff8f4b6fde18a4e cupertino_http: 94ac07f5ff090b8effa6c5e2c47871d48ab7c86c - device_info_plus: 4fb280989f669696856f8b129e4a5e3cd6c48f76 - file_picker: 7584aae6fa07a041af2b36a2655122d42f578c1a FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1 os_media_controls: 116bf9c1acadf13faf49b470b06a5033a19b67f0 - package_info_plus: f0052d280d17aa382b932f399edf32507174e870 screen_retriever_macos: 452e51764a9e1cdb74b3c541238795849f21557f - Sentry: d587a8fe91ca13503ecd69a1905f3e8a0fcf61be - sentry_flutter: 31101687061fb85211ebab09ce6eb8db4e9ba74f - shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb Sparkle: f4355f9ebbe9b7d932df4980d70f13922ac97b2a - sqlite3: a51c07cf16e023d6c48abd5e5791a61a47354921 - sqlite3_flutter_libs: b3e120efe9a82017e5552a620f696589ed4f62ab universal_gamepad: 8922f1f238f62d6847de887228976d5b572b57da - url_launcher_macos: f87a979182d112f911de6820aefddaf56ee9fbfd - wakelock_plus: 917609be14d812ddd9e9528876538b2263aaa03b - window_manager: b729e31d38fb04905235df9ea896128991cad99e PODFILE CHECKSUM: d16f5e5d196d1ca9863d7a71d5885cad7ffa7d2d diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index bc875d3b..45a5edb0 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -37,6 +37,7 @@ 6AD8B16A2ED7B50000E9E1B6 /* MpvPipController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AD8B16B2ED7B50000E9E1B6 /* MpvPipController.swift */; }; B1D51A6A2F00110000000003 /* MpvPlayerCoreBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D51A6A2F00110000000004 /* MpvPlayerCoreBase.swift */; }; B1D51A6A2F00110000000007 /* MpvPlayerPluginShared.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D51A6A2F00110000000008 /* MpvPlayerPluginShared.swift */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -104,6 +105,7 @@ B1D51A6A2F00110000000008 /* MpvPlayerPluginShared.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MpvPlayerPluginShared.swift; path = ../shared/apple/MpvPlayer/MpvPlayerPluginShared.swift; sourceTree = SOURCE_ROOT; }; B94440F7FE93A00B39D27ADF /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; DFD234339E4EACF84227E544 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -119,6 +121,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, 6AB6B0952EDB27C100EAC8DB /* MPVKit in Frameworks */, 28A54CB9141D0CB5BB3C2E50 /* Pods_Runner.framework in Frameworks */, ); @@ -194,6 +197,7 @@ 33CEB47122A05771004F2AC0 /* Flutter */ = { isa = PBXGroup; children = ( + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */, 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, @@ -263,6 +267,9 @@ productType = "com.apple.product-type.bundle.unit-test"; }; 33CC10EC2044A3C60003C045 /* Runner */ = { + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( @@ -325,6 +332,7 @@ ); mainGroup = 33CC10E42044A3C60003C045; packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */, 6AB6B0932EDB27C100EAC8DB /* XCRemoteSwiftPackageReference "MPVKit" */, ); productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; @@ -886,7 +894,17 @@ package = 6AB6B0932EDB27C100EAC8DB /* XCRemoteSwiftPackageReference "MPVKit" */; productName = MPVKit; }; + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; /* End XCSwiftPackageProductDependency section */ +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ }; rootObject = 33CC10E52044A3C60003C045 /* Project object */; } diff --git a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 55d3bf95..e5f8a355 100644 --- a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,6 +1,13 @@ { - "originHash" : "c535d3cdb62bd4e11e67f3c9e68290fa7ee9306634c5f56d2b0396eb75ed41ee", "pins" : [ + { + "identity" : "csqlite", + "kind" : "remoteSourceControl", + "location" : "https://github.com/simolus3/CSQLite.git", + "state" : { + "revision" : "1ee46d19a4f451a7aa64ffc64fc99b4748131e62" + } + }, { "identity" : "mpvkit", "kind" : "remoteSourceControl", @@ -8,7 +15,16 @@ "state" : { "revision" : "48fa1a1533062ae800772071a0ef6c36f553ba45" } + }, + { + "identity" : "sentry-cocoa", + "kind" : "remoteSourceControl", + "location" : "https://github.com/getsentry/sentry-cocoa", + "state" : { + "revision" : "16cd512711375fa73f25ae5e373f596bdf4251ae", + "version" : "8.58.0" + } } ], - "version" : 3 + "version" : 2 } diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 9917e837..27e1a857 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -5,6 +5,24 @@ + + + + + + + + + + =3.10.7 <4.0.0" - flutter: ">=3.38.4" + dart: ">=3.12.0 <4.0.0" + flutter: ">=3.44.0" diff --git a/pubspec.yaml b/pubspec.yaml index 4b005271..c12c9c40 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,8 +4,8 @@ publish_to: "none" version: 2.1.1+97 environment: - sdk: ">=3.10.7 <4.0.0" - flutter: ">=3.38.4" + sdk: ">=3.12.0 <4.0.0" + flutter: ">=3.44.0" dependencies: flutter: diff --git a/scripts/codegen.sh b/scripts/codegen.sh index cb6042a3..2fa24b21 100755 --- a/scripts/codegen.sh +++ b/scripts/codegen.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash set -euo pipefail cd "$(dirname "${BASH_SOURCE[0]}")/.." +dart run slang exec dart run build_runner build --delete-conflicting-outputs "$@" diff --git a/slang.yaml b/slang.yaml index c07ac0dc..4df90738 100644 --- a/slang.yaml +++ b/slang.yaml @@ -1,6 +1,7 @@ input_directory: lib/i18n input_file_pattern: .i18n.json output_directory: lib/i18n +timestamp: false # Fall back to base (en) for any key missing in a non-base locale. # Without this, every locale would need every key declared up-front and # the generator would emit `class is missing implementations for…`