diff options
Diffstat (limited to 'player-android/lib/screens/admin_trash_screen.dart')
| -rw-r--r-- | player-android/lib/screens/admin_trash_screen.dart | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/player-android/lib/screens/admin_trash_screen.dart b/player-android/lib/screens/admin_trash_screen.dart index 1b63596..db0354a 100644 --- a/player-android/lib/screens/admin_trash_screen.dart +++ b/player-android/lib/screens/admin_trash_screen.dart @@ -87,8 +87,9 @@ class _AdminTrashScreenState extends ConsumerState<AdminTrashScreen> { /// problem. Re-appending (rather than re-inserting at the original index) /// avoids position jitter from concurrent mutations. Future<void> _restore(Media item, int index) async { - // Optimistic removal: remove the item from the list immediately. - setState(() => _items!.removeAt(index)); + // Identity-based removal (by id) avoids position drift from concurrent + // operations that could shift list indices between tap and setState. + setState(() => _items!.removeWhere((e) => e.id == item.id)); try { await ref.read(apiClientProvider).restoreMedia(item.id); @@ -122,8 +123,9 @@ class _AdminTrashScreenState extends ConsumerState<AdminTrashScreen> { final confirmed = await _confirmHardDelete(item.fileName); if (!confirmed || !mounted) return; - // Optimistic removal. - setState(() => _items!.removeAt(index)); + // Identity-based removal (by id) avoids position drift from concurrent + // operations that could shift list indices between tap and setState. + setState(() => _items!.removeWhere((e) => e.id == item.id)); try { // deleteMedia soft-deletes again (no-op for an already-deleted item) @@ -174,6 +176,7 @@ class _AdminTrashScreenState extends ConsumerState<AdminTrashScreen> { ], ), ); + // Tapping outside the dialog returns null; treat as cancel (no deletion). return result ?? false; } |
