diff --git a/lib/widgets/collection/collection_grid.dart b/lib/widgets/collection/collection_grid.dart index 81a4692ca..a063ed908 100644 --- a/lib/widgets/collection/collection_grid.dart +++ b/lib/widgets/collection/collection_grid.dart @@ -579,9 +579,7 @@ class _CollectionScrollViewState extends State<_CollectionScrollView> with Widge }); } - void _stopScrollMonitoringTimer() { - _scrollMonitoringTimer?.cancel(); - } + void _stopScrollMonitoringTimer() => _scrollMonitoringTimer?.cancel(); Map _getCrumbs(List sectionLayouts) { final crumbs = {}; diff --git a/lib/widgets/common/grid/selector.dart b/lib/widgets/common/grid/selector.dart index 20c0c98f7..e4643e362 100644 --- a/lib/widgets/common/grid/selector.dart +++ b/lib/widgets/common/grid/selector.dart @@ -6,6 +6,7 @@ import 'package:aves/utils/math_utils.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/extensions/media_query.dart'; import 'package:aves/widgets/common/grid/sections/list_layout.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -37,7 +38,9 @@ class _GridSelectionGestureDetectorState extends State get items => widget.items; @@ -56,12 +59,42 @@ class _GridSelectionGestureDetectorState extends State oldWidget) { + super.didUpdateWidget(oldWidget); + _unregisterWidget(oldWidget); + _registerWidget(widget); + } + + @override + void dispose() { + _unregisterWidget(widget); + _stopScrollMonitoringTimer(); + super.dispose(); + } + + void _registerWidget(GridSelectionGestureDetector widget) { + widget.scrollController.addListener(_onScrollChanged); + } + + void _unregisterWidget(GridSelectionGestureDetector widget) { + widget.scrollController.removeListener(_onScrollChanged); + } + @override Widget build(BuildContext context) { final selectable = widget.selectable; return GestureDetector( onLongPressStart: selectable ? (details) { + if (_isScrolling) return; + final fromItem = _getItemAt(details.localPosition); if (fromItem == null) return; @@ -105,6 +138,16 @@ class _GridSelectionGestureDetectorState extends State _scrollMonitoringTimer?.cancel(); + void _onLongPressUpdate() { final dy = _localPosition.dy; @@ -128,7 +171,7 @@ class _GridSelectionGestureDetectorState extends State extends State _onLongPressUpdate()); + _selectionUpdateTimer = Timer.periodic(scrollUpdateInterval, (_) => _onLongPressUpdate()); } }