fix(mobile): video player restarting when device rotates (#17362)

* fix(mobile): Video player restarting when device rotates

* use global key in state

* Implement suggestions from code review
This commit is contained in:
Sebastian Schneider 2025-04-07 16:26:08 +02:00 committed by GitHub
parent 99cddf1fd6
commit 1e4b9ae5b7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -12,8 +12,8 @@ import 'package:immich_mobile/entities/asset.entity.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/extensions/scroll_extensions.dart';
import 'package:immich_mobile/pages/common/download_panel.dart';
import 'package:immich_mobile/pages/common/native_video_viewer.page.dart';
import 'package:immich_mobile/pages/common/gallery_stacked_children.dart';
import 'package:immich_mobile/pages/common/native_video_viewer.page.dart';
import 'package:immich_mobile/providers/app_settings.provider.dart';
import 'package:immich_mobile/providers/asset_viewer/asset_stack.provider.dart';
import 'package:immich_mobile/providers/asset_viewer/current_asset.provider.dart';
@ -63,6 +63,10 @@ class GalleryViewerPage extends HookConsumerWidget {
final loadAsset = renderList.loadAsset;
final isPlayingMotionVideo = ref.watch(isPlayingMotionVideoProvider);
// This key is to prevent the video player from being re-initialized during
// hero animation or device rotation.
final videoPlayerKey = useMemoized(() => GlobalKey());
Future<void> precacheNextImage(int index) async {
if (!context.mounted) {
return;
@ -225,8 +229,6 @@ class GalleryViewerPage extends HookConsumerWidget {
}
PhotoViewGalleryPageOptions buildVideo(BuildContext context, Asset asset) {
// This key is to prevent the video player from being re-initialized during the hero animation
final key = GlobalKey();
return PhotoViewGalleryPageOptions.customChild(
onDragStart: (_, details, __) =>
localPosition.value = details.localPosition,
@ -241,7 +243,7 @@ class GalleryViewerPage extends HookConsumerWidget {
width: context.width,
height: context.height,
child: NativeVideoViewerPage(
key: key,
key: videoPlayerKey,
asset: asset,
image: Image(
key: ValueKey(asset),