@@ -8,25 +8,25 @@ import 'package:easy_localization/easy_localization.dart';
8
8
import 'package:flutter/material.dart' ;
9
9
import 'package:flutter/rendering.dart' ;
10
10
import 'package:flutter/services.dart' ;
11
+ import 'package:fluttertoast/fluttertoast.dart' ;
11
12
import 'package:hooks_riverpod/hooks_riverpod.dart' ;
13
+ import 'package:immich_mobile/entities/asset.entity.dart' ;
12
14
import 'package:immich_mobile/extensions/build_context_extensions.dart' ;
13
15
import 'package:immich_mobile/extensions/collection_extensions.dart' ;
14
16
import 'package:immich_mobile/extensions/theme_extensions.dart' ;
15
17
import 'package:immich_mobile/providers/asset_viewer/current_asset.provider.dart' ;
16
18
import 'package:immich_mobile/providers/asset_viewer/is_motion_video_playing.provider.dart' ;
17
19
import 'package:immich_mobile/providers/asset_viewer/scroll_notifier.provider.dart' ;
20
+ import 'package:immich_mobile/providers/asset_viewer/scroll_to_date_notifier.provider.dart' ;
18
21
import 'package:immich_mobile/providers/asset_viewer/show_controls.provider.dart' ;
22
+ import 'package:immich_mobile/providers/haptic_feedback.provider.dart' ;
23
+ import 'package:immich_mobile/providers/tab.provider.dart' ;
24
+ import 'package:immich_mobile/routing/router.dart' ;
19
25
import 'package:immich_mobile/widgets/asset_grid/asset_drag_region.dart' ;
26
+ import 'package:immich_mobile/widgets/asset_grid/control_bottom_app_bar.dart' ;
20
27
import 'package:immich_mobile/widgets/asset_grid/thumbnail_image.dart' ;
21
28
import 'package:immich_mobile/widgets/asset_grid/thumbnail_placeholder.dart' ;
22
29
import 'package:immich_mobile/widgets/common/immich_toast.dart' ;
23
- import 'package:fluttertoast/fluttertoast.dart' ;
24
- import 'package:immich_mobile/widgets/asset_grid/control_bottom_app_bar.dart' ;
25
- import 'package:immich_mobile/routing/router.dart' ;
26
- import 'package:immich_mobile/entities/asset.entity.dart' ;
27
- import 'package:immich_mobile/providers/asset_viewer/scroll_to_date_notifier.provider.dart' ;
28
- import 'package:immich_mobile/providers/haptic_feedback.provider.dart' ;
29
- import 'package:immich_mobile/providers/tab.provider.dart' ;
30
30
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart' ;
31
31
32
32
import 'asset_grid_data_structure.dart' ;
@@ -107,6 +107,8 @@ class ImmichAssetGridViewState extends ConsumerState<ImmichAssetGridView> {
107
107
final Set <Asset > _draggedAssets =
108
108
HashSet (equals: (a, b) => a.id == b.id, hashCode: (a) => a.id);
109
109
110
+ ScrollPhysics ? _scrollPhysics;
111
+
110
112
Set <Asset > _getSelectedAssets () {
111
113
return Set .from (_selectedAssets);
112
114
}
@@ -265,6 +267,7 @@ class ImmichAssetGridViewState extends ConsumerState<ImmichAssetGridView> {
265
267
),
266
268
itemBuilder: _itemBuilder,
267
269
itemPositionsListener: _itemPositionsListener,
270
+ physics: _scrollPhysics,
268
271
itemScrollController: _itemScrollController,
269
272
scrollOffsetController: _scrollOffsetController,
270
273
itemCount: widget.renderList.elements.length +
@@ -439,13 +442,20 @@ class ImmichAssetGridViewState extends ConsumerState<ImmichAssetGridView> {
439
442
440
443
void _setDragStartIndex (AssetIndex index) {
441
444
setState (() {
445
+ _scrollPhysics = const ClampingScrollPhysics ();
442
446
_dragAnchorAssetIndex = index.rowIndex;
443
447
_dragAnchorSectionIndex = index.sectionIndex;
444
448
_dragging = true ;
445
449
});
446
450
}
447
451
448
452
void _stopDrag () {
453
+ WidgetsBinding .instance.addPostFrameCallback ((_) {
454
+ // Update the physics post frame to prevent sudden change in physics on iOS.
455
+ setState (() {
456
+ _scrollPhysics = null ;
457
+ });
458
+ });
449
459
setState (() {
450
460
_dragging = false ;
451
461
_draggedAssets.clear ();
0 commit comments