Compare commits

...

2 Commits

Author SHA1 Message Date
shenlong-tanwen
2d1a47b70f fix lint 2026-02-26 22:53:08 +05:30
shenlong-tanwen
39ef77a02a fix: frame skip due to native viewer rebuilds 2026-02-26 22:45:23 +05:30
2 changed files with 24 additions and 6 deletions

View File

@@ -19,10 +19,10 @@ import 'package:immich_mobile/presentation/widgets/images/thumbnail.widget.dart'
import 'package:immich_mobile/providers/app_settings.provider.dart';
import 'package:immich_mobile/providers/asset_viewer/is_motion_video_playing.provider.dart';
import 'package:immich_mobile/providers/asset_viewer/video_player_controls_provider.dart';
import 'package:immich_mobile/services/app_settings.service.dart';
import 'package:immich_mobile/providers/infrastructure/asset.provider.dart';
import 'package:immich_mobile/providers/infrastructure/asset_viewer/asset.provider.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/services/app_settings.service.dart';
import 'package:immich_mobile/widgets/common/immich_loading_indicator.dart';
import 'package:immich_mobile/widgets/photo_view/photo_view.dart';
@@ -31,9 +31,16 @@ enum _DragIntent { none, scroll, dismiss }
class AssetPage extends ConsumerStatefulWidget {
final int index;
final int heroOffset;
final Map<String, GlobalKey> videoPlayerKeys;
final void Function(int direction)? onTapNavigate;
const AssetPage({super.key, required this.index, required this.heroOffset, this.onTapNavigate});
const AssetPage({
super.key,
required this.index,
required this.heroOffset,
required this.videoPlayerKeys,
this.onTapNavigate,
});
@override
ConsumerState createState() => _AssetPageState();
@@ -293,6 +300,11 @@ class _AssetPageState extends ConsumerState<AssetPage> {
_listenForScaleBoundaries(controller);
}
GlobalKey _getVideoPlayerKey(String id) {
widget.videoPlayerKeys.putIfAbsent(id, () => GlobalKey());
return widget.videoPlayerKeys[id]!;
}
Widget _buildPhotoView(
BaseAsset displayAsset,
BaseAsset asset, {
@@ -350,7 +362,7 @@ class _AssetPageState extends ConsumerState<AssetPage> {
enablePanAlways: true,
backgroundDecoration: backgroundDecoration,
child: NativeVideoViewer(
key: ValueKey(displayAsset),
key: _getVideoPlayerKey(displayAsset.heroTag),
asset: displayAsset,
scaleStateNotifier: _videoScaleStateNotifier,
disableScaleGestures: showingDetails,

View File

@@ -18,8 +18,8 @@ import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_page.widge
import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_preloader.dart';
import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_stack.provider.dart';
import 'package:immich_mobile/presentation/widgets/asset_viewer/asset_viewer.state.dart';
import 'package:immich_mobile/presentation/widgets/asset_viewer/viewer_top_app_bar.widget.dart';
import 'package:immich_mobile/presentation/widgets/asset_viewer/viewer_bottom_app_bar.widget.dart';
import 'package:immich_mobile/presentation/widgets/asset_viewer/viewer_top_app_bar.widget.dart';
import 'package:immich_mobile/providers/asset_viewer/video_player_controls_provider.dart';
import 'package:immich_mobile/providers/asset_viewer/video_player_value_provider.dart';
import 'package:immich_mobile/providers/cast.provider.dart';
@@ -90,6 +90,7 @@ class _AssetViewerState extends ConsumerState<AssetViewer> {
late final _heroOffset = widget.heroOffset ?? TabsRouterScope.of(context)?.controller.activeIndex ?? 0;
late final _pageController = PageController(initialPage: widget.initialIndex);
late final _preloader = AssetPreloader(timelineService: ref.read(timelineServiceProvider), mounted: () => mounted);
final Map<String, GlobalKey> _videoPlayerKeys = {};
StreamSubscription? _reloadSubscription;
KeepAliveLink? _stackChildrenKeepAlive;
@@ -124,6 +125,7 @@ class _AssetViewerState extends ConsumerState<AssetViewer> {
@override
void dispose() {
_videoPlayerKeys.clear();
_pageController.dispose();
_preloader.dispose();
_reloadSubscription?.cancel();
@@ -287,8 +289,12 @@ class _AssetViewerState extends ConsumerState<AssetViewer> {
: const FastClampingScrollPhysics(),
itemCount: ref.read(timelineServiceProvider).totalAssets,
onPageChanged: (index) => _onAssetChanged(index),
itemBuilder: (context, index) =>
AssetPage(index: index, heroOffset: _heroOffset, onTapNavigate: _onTapNavigate),
itemBuilder: (context, index) => AssetPage(
index: index,
heroOffset: _heroOffset,
videoPlayerKeys: _videoPlayerKeys,
onTapNavigate: _onTapNavigate,
),
),
),
if (!CurrentPlatform.isIOS)