fix(mobile): reset asset index on timeline refresh

The current asset changes when the timeline refreshes, which can be
quite jarring. Assets are tracked by their index, and that index becomes
stale when the timeline refreshes. This can be resolved by updating the
index of asset based on a unique identifier (like the hero tag).
This commit is contained in:
Thomas Way
2026-01-30 16:14:41 +00:00
parent d5ad35ea52
commit 1424857327
2 changed files with 22 additions and 5 deletions

View File

@@ -227,6 +227,13 @@ class TimelineService {
return _buffer.elementAt(index - _bufferOffset);
}
/// Finds the index of an asset by its heroTag within the current buffer.
/// Returns null if the asset is not found in the buffer.
int? getIndex(String heroTag) {
final index = _buffer.indexWhere((a) => a.heroTag == heroTag);
return index >= 0 ? _bufferOffset + index : null;
}
Future<void> dispose() async {
await _bucketSubscription?.cancel();
_bucketSubscription = null;

View File

@@ -451,21 +451,31 @@ class _AssetViewerState extends ConsumerState<AssetViewer> {
}
void _onTimelineReloadEvent() {
totalAssets = ref.read(timelineServiceProvider).totalAssets;
final timelineService = ref.read(timelineServiceProvider);
totalAssets = timelineService.totalAssets;
if (totalAssets == 0) {
context.maybePop();
return;
}
var index = pageController.page?.round() ?? 0;
final currentAsset = ref.read(currentAssetNotifier);
if (currentAsset != null) {
final newIndex = timelineService.getIndex(currentAsset.heroTag);
if (newIndex != null && newIndex != index) {
index = newIndex;
pageController.jumpToPage(index);
}
}
if (assetReloadRequested) {
assetReloadRequested = false;
_onAssetReloadEvent();
return;
_onAssetReloadEvent(index);
}
}
void _onAssetReloadEvent() async {
final index = pageController.page?.round() ?? 0;
void _onAssetReloadEvent(int index) async {
final timelineService = ref.read(timelineServiceProvider);
final newAsset = await timelineService.getAssetAsync(index);