diff --git a/.github/workflows/static_analysis.yml b/.github/workflows/static_analysis.yml
index 7f1ce1988e..e11330d428 100644
--- a/.github/workflows/static_analysis.yml
+++ b/.github/workflows/static_analysis.yml
@@ -100,8 +100,9 @@ jobs:
- name: Run dart format
run: make format
- - name: Run dart custom_lint
- run: dart run custom_lint
+ # TODO: Re-enable after upgrading custom_lint
+ # - name: Run dart custom_lint
+ # run: dart run custom_lint
# TODO: Use https://github.com/CQLabs/dcm-action
- name: Run DCM
diff --git a/mise.lock b/mise.lock
index 112b1ca6eb..9aae0b9572 100644
--- a/mise.lock
+++ b/mise.lock
@@ -3,7 +3,7 @@ version = "3.8.2"
backend = "asdf:dart"
[tools.flutter]
-version = "3.32.8-stable"
+version = "3.35.3-stable"
backend = "asdf:flutter"
[tools."github:CQLabs/homebrew-dcm"]
diff --git a/mise.toml b/mise.toml
index ff9fa3895d..1ee34ad75d 100644
--- a/mise.toml
+++ b/mise.toml
@@ -1,6 +1,6 @@
[tools]
node = "22.19.0"
-flutter = "3.32.8"
+flutter = "3.35.3"
pnpm = "10.14.0"
dart = "3.8.2"
diff --git a/mobile/.fvmrc b/mobile/.fvmrc
index 3ca65ffc7c..d8a11548fd 100644
--- a/mobile/.fvmrc
+++ b/mobile/.fvmrc
@@ -1,3 +1,3 @@
{
- "flutter": "3.32.8"
+ "flutter": "3.35.3"
}
\ No newline at end of file
diff --git a/mobile/.vscode/settings.json b/mobile/.vscode/settings.json
index 9a9fb67ce3..0c2f2c29cc 100644
--- a/mobile/.vscode/settings.json
+++ b/mobile/.vscode/settings.json
@@ -1,8 +1,8 @@
{
- "dart.flutterSdkPath": ".fvm/versions/3.32.8",
+ "dart.flutterSdkPath": ".fvm/versions/3.35.3",
"dart.lineLength": 120,
"[dart]": {
- "editor.rulers": [120],
+ "editor.rulers": [120]
},
"search.exclude": {
"**/.fvm": true
diff --git a/mobile/analysis_options.yaml b/mobile/analysis_options.yaml
index c26e1c6649..c04e1dafdc 100644
--- a/mobile/analysis_options.yaml
+++ b/mobile/analysis_options.yaml
@@ -43,8 +43,9 @@ analyzer:
- lib/**/*.g.dart
- lib/**/*.drift.dart
- plugins:
- - custom_lint
+ # TODO: Re-enable after upgrading custom_lint
+ # plugins:
+ # - custom_lint
custom_lint:
debug: true
diff --git a/mobile/ios/Flutter/AppFrameworkInfo.plist b/mobile/ios/Flutter/AppFrameworkInfo.plist
index 7c56964006..1dc6cf7652 100644
--- a/mobile/ios/Flutter/AppFrameworkInfo.plist
+++ b/mobile/ios/Flutter/AppFrameworkInfo.plist
@@ -21,6 +21,6 @@
CFBundleVersion
1.0
MinimumOSVersion
- 12.0
+ 13.0
diff --git a/mobile/ios/Podfile.lock b/mobile/ios/Podfile.lock
index 09bd36022b..502fd9008f 100644
--- a/mobile/ios/Podfile.lock
+++ b/mobile/ios/Podfile.lock
@@ -253,7 +253,7 @@ SPEC CHECKSUMS:
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be
- Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
+ Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
flutter_local_notifications: ad39620c743ea4c15127860f4b5641649a988100
flutter_native_splash: c32d145d68aeda5502d5f543ee38c192065986cf
flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13
diff --git a/mobile/lib/pages/album/album_options.page.dart b/mobile/lib/pages/album/album_options.page.dart
index e659340f26..20d4dbd325 100644
--- a/mobile/lib/pages/album/album_options.page.dart
+++ b/mobile/lib/pages/album/album_options.page.dart
@@ -169,7 +169,7 @@ class AlbumOptionsPage extends HookConsumerWidget {
album.activityEnabled = value;
}
},
- activeColor: activityEnabled.value ? context.primaryColor : context.themeData.disabledColor,
+ activeThumbColor: activityEnabled.value ? context.primaryColor : context.themeData.disabledColor,
dense: true,
title: Text(
"comments_and_likes",
diff --git a/mobile/lib/pages/library/shared_link/shared_link_edit.page.dart b/mobile/lib/pages/library/shared_link/shared_link_edit.page.dart
index c78a9d5138..8b66bb231f 100644
--- a/mobile/lib/pages/library/shared_link/shared_link_edit.page.dart
+++ b/mobile/lib/pages/library/shared_link/shared_link_edit.page.dart
@@ -112,7 +112,7 @@ class SharedLinkEditPage extends HookConsumerWidget {
return SwitchListTile.adaptive(
value: showMetadata.value,
onChanged: newShareLink.value.isEmpty ? (value) => showMetadata.value = value : null,
- activeColor: colorScheme.primary,
+ activeThumbColor: colorScheme.primary,
dense: true,
title: Text("show_metadata", style: themeData.textTheme.labelLarge?.copyWith(fontWeight: FontWeight.bold)).tr(),
);
@@ -122,7 +122,7 @@ class SharedLinkEditPage extends HookConsumerWidget {
return SwitchListTile.adaptive(
value: allowDownload.value,
onChanged: newShareLink.value.isEmpty ? (value) => allowDownload.value = value : null,
- activeColor: colorScheme.primary,
+ activeThumbColor: colorScheme.primary,
dense: true,
title: Text(
"allow_public_user_to_download",
@@ -135,7 +135,7 @@ class SharedLinkEditPage extends HookConsumerWidget {
return SwitchListTile.adaptive(
value: allowUpload.value,
onChanged: newShareLink.value.isEmpty ? (value) => allowUpload.value = value : null,
- activeColor: colorScheme.primary,
+ activeThumbColor: colorScheme.primary,
dense: true,
title: Text(
"allow_public_user_to_upload",
@@ -148,7 +148,7 @@ class SharedLinkEditPage extends HookConsumerWidget {
return SwitchListTile.adaptive(
value: editExpiry.value,
onChanged: newShareLink.value.isEmpty ? (value) => editExpiry.value = value : null,
- activeColor: colorScheme.primary,
+ activeThumbColor: colorScheme.primary,
dense: true,
title: Text(
"change_expiration_time",
diff --git a/mobile/lib/presentation/pages/drift_album_options.page.dart b/mobile/lib/presentation/pages/drift_album_options.page.dart
index b8dcbd91f9..7f49a1ff79 100644
--- a/mobile/lib/presentation/pages/drift_album_options.page.dart
+++ b/mobile/lib/presentation/pages/drift_album_options.page.dart
@@ -208,7 +208,7 @@ class DriftAlbumOptionsPage extends HookConsumerWidget {
activityEnabled.value = value;
await ref.read(remoteAlbumProvider.notifier).setActivityStatus(album.id, value);
},
- activeColor: activityEnabled.value ? context.primaryColor : context.themeData.disabledColor,
+ activeThumbColor: activityEnabled.value ? context.primaryColor : context.themeData.disabledColor,
dense: true,
title: Text(
"comments_and_likes",
diff --git a/mobile/lib/presentation/widgets/images/image_provider.dart b/mobile/lib/presentation/widgets/images/image_provider.dart
index dd87d2f228..ab5ead5ca5 100644
--- a/mobile/lib/presentation/widgets/images/image_provider.dart
+++ b/mobile/lib/presentation/widgets/images/image_provider.dart
@@ -96,7 +96,7 @@ mixin CancellableImageProviderMixin on CancellableImageProvide
final operation = cachedOperation;
if (operation != null) {
- this.cachedOperation = null;
+ cachedOperation = null;
operation.cancel();
}
}
diff --git a/mobile/lib/widgets/map/map_settings/map_settings_list_tile.dart b/mobile/lib/widgets/map/map_settings/map_settings_list_tile.dart
index 51567eff15..e97875fd90 100644
--- a/mobile/lib/widgets/map/map_settings/map_settings_list_tile.dart
+++ b/mobile/lib/widgets/map/map_settings/map_settings_list_tile.dart
@@ -13,7 +13,7 @@ class MapSettingsListTile extends StatelessWidget {
@override
Widget build(BuildContext context) {
return SwitchListTile.adaptive(
- activeColor: context.primaryColor,
+ activeThumbColor: context.primaryColor,
title: Text(title, style: context.textTheme.labelLarge?.copyWith(fontWeight: FontWeight.bold)).tr(),
value: selected,
onChanged: onChanged,
diff --git a/mobile/lib/widgets/photo_view/src/core/photo_view_core.dart b/mobile/lib/widgets/photo_view/src/core/photo_view_core.dart
index a8d53e5106..d21b49f020 100644
--- a/mobile/lib/widgets/photo_view/src/core/photo_view_core.dart
+++ b/mobile/lib/widgets/photo_view/src/core/photo_view_core.dart
@@ -350,8 +350,8 @@ class PhotoViewCoreState extends State
final computedScale = useImageScale ? 1.0 : scale;
final matrix = Matrix4.identity()
- ..translate(value.position.dx, value.position.dy)
- ..scale(computedScale)
+ ..translateByDouble(value.position.dx, value.position.dy, 0, 1.0)
+ ..scaleByDouble(computedScale, computedScale, computedScale, 1.0)
..rotateZ(value.rotation);
final Widget customChildLayout = CustomSingleChildLayout(
diff --git a/mobile/lib/widgets/search/search_filter/media_type_picker.dart b/mobile/lib/widgets/search/search_filter/media_type_picker.dart
index 589ce6262b..e0e34b654e 100644
--- a/mobile/lib/widgets/search/search_filter/media_type_picker.dart
+++ b/mobile/lib/widgets/search/search_filter/media_type_picker.dart
@@ -13,40 +13,19 @@ class MediaTypePicker extends HookWidget {
Widget build(BuildContext context) {
final selectedMediaType = useState(filter ?? AssetType.other);
- return ListView(
- shrinkWrap: true,
- children: [
- RadioListTile(
- key: const Key("all"),
- title: const Text("all").tr(),
- value: AssetType.other,
- onChanged: (value) {
- selectedMediaType.value = value!;
- onSelect(value);
- },
- groupValue: selectedMediaType.value,
- ),
- RadioListTile(
- key: const Key("image"),
- title: const Text("image").tr(),
- value: AssetType.image,
- onChanged: (value) {
- selectedMediaType.value = value!;
- onSelect(value);
- },
- groupValue: selectedMediaType.value,
- ),
- RadioListTile(
- key: const Key("video"),
- title: const Text("video").tr(),
- value: AssetType.video,
- onChanged: (value) {
- selectedMediaType.value = value!;
- onSelect(value);
- },
- groupValue: selectedMediaType.value,
- ),
- ],
+ return RadioGroup(
+ onChanged: (value) {
+ selectedMediaType.value = value!;
+ onSelect(value);
+ },
+ groupValue: selectedMediaType.value,
+ child: Column(
+ children: [
+ RadioListTile(key: const Key("all"), title: const Text("all").tr(), value: AssetType.other),
+ RadioListTile(key: const Key("image"), title: const Text("image").tr(), value: AssetType.image),
+ RadioListTile(key: const Key("video"), title: const Text("video").tr(), value: AssetType.video),
+ ],
+ ),
);
}
}
diff --git a/mobile/lib/widgets/settings/beta_timeline_list_tile.dart b/mobile/lib/widgets/settings/beta_timeline_list_tile.dart
index 9a3b4f5c96..326d6c49d1 100644
--- a/mobile/lib/widgets/settings/beta_timeline_list_tile.dart
+++ b/mobile/lib/widgets/settings/beta_timeline_list_tile.dart
@@ -62,7 +62,7 @@ class BetaTimelineListTile extends ConsumerWidget {
trailing: Switch.adaptive(
value: betaTimelineValue,
onChanged: onSwitchChanged,
- activeColor: context.primaryColor,
+ activeThumbColor: context.primaryColor,
),
onTap: () => onSwitchChanged(!betaTimelineValue),
),
diff --git a/mobile/lib/widgets/settings/preference_settings/primary_color_setting.dart b/mobile/lib/widgets/settings/preference_settings/primary_color_setting.dart
index ddf2cc6215..22c9154981 100644
--- a/mobile/lib/widgets/settings/preference_settings/primary_color_setting.dart
+++ b/mobile/lib/widgets/settings/preference_settings/primary_color_setting.dart
@@ -115,7 +115,7 @@ class PrimaryColorSetting extends HookConsumerWidget {
child: SwitchListTile.adaptive(
contentPadding: const EdgeInsets.symmetric(vertical: 6, horizontal: 20),
dense: true,
- activeColor: context.primaryColor,
+ activeThumbColor: context.primaryColor,
tileColor: context.colorScheme.surfaceContainerHigh,
shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(15))),
title: Text(
diff --git a/mobile/lib/widgets/settings/settings_radio_list_tile.dart b/mobile/lib/widgets/settings/settings_radio_list_tile.dart
index 95224e3f59..6b02a65159 100644
--- a/mobile/lib/widgets/settings/settings_radio_list_tile.dart
+++ b/mobile/lib/widgets/settings/settings_radio_list_tile.dart
@@ -9,7 +9,7 @@ class SettingsRadioGroup {
}
class SettingsRadioListTile extends StatelessWidget {
- final List groups;
+ final List> groups;
final T groupBy;
final void Function(T?) onRadioChanged;
@@ -17,21 +17,23 @@ class SettingsRadioListTile extends StatelessWidget {
@override
Widget build(BuildContext context) {
- return Column(
- children: groups
- .map(
- (g) => RadioListTile(
- contentPadding: const EdgeInsets.symmetric(horizontal: 20),
- dense: true,
- activeColor: context.primaryColor,
- title: Text(g.title, style: context.textTheme.bodyLarge?.copyWith(fontWeight: FontWeight.w500)),
- value: g.value,
- groupValue: groupBy,
- onChanged: onRadioChanged,
- controlAffinity: ListTileControlAffinity.trailing,
- ),
- )
- .toList(),
+ return RadioGroup(
+ groupValue: groupBy,
+ onChanged: onRadioChanged,
+ child: Column(
+ children: groups
+ .map(
+ (g) => RadioListTile(
+ contentPadding: const EdgeInsets.symmetric(horizontal: 20),
+ dense: true,
+ activeColor: context.primaryColor,
+ title: Text(g.title, style: context.textTheme.bodyLarge?.copyWith(fontWeight: FontWeight.w500)),
+ value: g.value,
+ controlAffinity: ListTileControlAffinity.trailing,
+ ),
+ )
+ .toList(),
+ ),
);
}
}
diff --git a/mobile/lib/widgets/settings/settings_switch_list_tile.dart b/mobile/lib/widgets/settings/settings_switch_list_tile.dart
index d51e2eb2ca..f5d6dfd05a 100644
--- a/mobile/lib/widgets/settings/settings_switch_list_tile.dart
+++ b/mobile/lib/widgets/settings/settings_switch_list_tile.dart
@@ -40,7 +40,7 @@ class SettingsSwitchListTile extends StatelessWidget {
selectedTileColor: enabled ? null : context.themeData.disabledColor,
value: valueNotifier.value,
onChanged: onSwitchChanged,
- activeColor: enabled ? context.primaryColor : context.themeData.disabledColor,
+ activeThumbColor: enabled ? context.primaryColor : context.themeData.disabledColor,
dense: true,
secondary: icon != null ? Icon(icon!, color: valueNotifier.value ? context.primaryColor : null) : null,
title: Text(
diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock
index 35513cca35..92e2a56172 100644
--- a/mobile/pubspec.lock
+++ b/mobile/pubspec.lock
@@ -1064,26 +1064,26 @@ packages:
dependency: transitive
description:
name: leak_tracker
- sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0"
+ sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
url: "https://pub.dev"
source: hosted
- version: "10.0.9"
+ version: "11.0.2"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
- sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
+ sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
url: "https://pub.dev"
source: hosted
- version: "3.0.9"
+ version: "3.0.10"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
- sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
+ sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
url: "https://pub.dev"
source: hosted
- version: "3.0.1"
+ version: "3.0.2"
lints:
dependency: transitive
description:
@@ -1877,10 +1877,10 @@ packages:
dependency: transitive
description:
name: test_api
- sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
+ sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00"
url: "https://pub.dev"
source: hosted
- version: "0.7.4"
+ version: "0.7.6"
thumbhash:
dependency: "direct main"
description:
@@ -2037,10 +2037,10 @@ packages:
dependency: transitive
description:
name: vector_math
- sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
+ sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
url: "https://pub.dev"
source: hosted
- version: "2.1.4"
+ version: "2.2.0"
vm_service:
dependency: transitive
description:
@@ -2171,4 +2171,4 @@ packages:
version: "3.1.3"
sdks:
dart: ">=3.8.0 <4.0.0"
- flutter: ">=3.32.8"
+ flutter: ">=3.35.3"
diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml
index bb9c459f3f..bd8817ce06 100644
--- a/mobile/pubspec.yaml
+++ b/mobile/pubspec.yaml
@@ -6,7 +6,7 @@ version: 1.142.1+3015
environment:
sdk: '>=3.8.0 <4.0.0'
- flutter: 3.32.8
+ flutter: 3.35.3
isar_version: &isar_version 3.1.8
diff --git a/server/Dockerfile.dev b/server/Dockerfile.dev
index 1db03bc844..644d605f48 100644
--- a/server/Dockerfile.dev
+++ b/server/Dockerfile.dev
@@ -56,7 +56,7 @@ RUN if [ "$(dpkg --print-architecture)" = "arm64" ]; then \
# Flutter SDK
# https://flutter.dev/docs/development/tools/sdk/releases?tab=linux
ENV FLUTTER_CHANNEL="stable"
-ENV FLUTTER_VERSION="3.32.8"
+ENV FLUTTER_VERSION="3.35.3"
ENV FLUTTER_HOME=/flutter
ENV PATH=${PATH}:${FLUTTER_HOME}/bin