fix: current viewer asset reactivity (#29282)

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
This commit is contained in:
shenlong
2026-06-23 18:40:24 +00:00
committed by GitHub
co-authored by shenlong-tanwen
parent f29f86542c
commit 9d6c219276
5 changed files with 168 additions and 21 deletions
@@ -1,3 +1,5 @@
import 'dart:async';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/providers/asset_viewer/video_player_provider.dart';
@@ -77,18 +79,17 @@ class AssetViewerState {
}
class AssetViewerStateNotifier extends Notifier<AssetViewerState> {
StreamSubscription<BaseAsset?>? _assetSubscription;
@override
AssetViewerState build() {
ref.listen(_watchedCurrentAssetProvider, (_, next) {
final updated = next.valueOrNull;
if (updated != null) {
state = state.copyWith(currentAsset: updated);
}
});
ref.onDispose(() => _assetSubscription?.cancel());
return const AssetViewerState();
}
void reset() {
_assetSubscription?.cancel();
_assetSubscription = null;
state = const AssetViewerState();
}
@@ -97,6 +98,16 @@ class AssetViewerStateNotifier extends Notifier<AssetViewerState> {
return;
}
state = state.copyWith(currentAsset: asset, stackIndex: 0, showingOcr: false);
_watchCurrentAsset(asset);
}
void _watchCurrentAsset(BaseAsset asset) {
_assetSubscription?.cancel();
_assetSubscription = ref.read(assetServiceProvider).watchAsset(asset).listen((updated) {
if (updated != null) {
state = state.copyWith(currentAsset: updated);
}
});
}
void setOpacity(double opacity) {
@@ -150,12 +161,3 @@ class AssetViewerStateNotifier extends Notifier<AssetViewerState> {
}
final assetViewerProvider = NotifierProvider<AssetViewerStateNotifier, AssetViewerState>(AssetViewerStateNotifier.new);
final _watchedCurrentAssetProvider = StreamProvider<BaseAsset?>((ref) {
ref.watch(assetViewerProvider.select((s) => s.currentAsset?.heroTag));
final asset = ref.read(assetViewerProvider).currentAsset;
if (asset == null) {
return const Stream.empty();
}
return ref.read(assetServiceProvider).watchAsset(asset);
});