diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index 3f95c206d..b5177ab0f 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -189,9 +189,7 @@ class Settings extends ChangeNotifier { double getTileExtent(String routeName) => _prefs!.getDouble(tileExtentPrefixKey + routeName) ?? 0; - // do not notify, as tile extents are only used internally by `TileExtentController` - // and should not trigger rebuilding by change notification - void setTileExtent(String routeName, double newValue) => setAndNotify(tileExtentPrefixKey + routeName, newValue, notify: false); + void setTileExtent(String routeName, double newValue) => setAndNotify(tileExtentPrefixKey + routeName, newValue); // collection @@ -362,7 +360,7 @@ class Settings extends ChangeNotifier { return _prefs!.getStringList(key)?.map((s) => values.firstWhereOrNull((v) => v.toString() == s)).where((v) => v != null).cast().toList() ?? defaultValue; } - void setAndNotify(String key, dynamic newValue, {bool notify = true}) { + void setAndNotify(String key, dynamic newValue) { var oldValue = _prefs!.get(key); if (newValue == null) { _prefs!.remove(key); @@ -382,7 +380,7 @@ class Settings extends ChangeNotifier { oldValue = _prefs!.getBool(key); _prefs!.setBool(key, newValue); } - if (oldValue != newValue && notify) { + if (oldValue != newValue) { notifyListeners(); } } diff --git a/lib/model/source/collection_lens.dart b/lib/model/source/collection_lens.dart index f1f2c1fed..ed4a96001 100644 --- a/lib/model/source/collection_lens.dart +++ b/lib/model/source/collection_lens.dart @@ -65,7 +65,7 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin { ..forEach((sub) => sub.cancel()) ..clear(); favourites.removeListener(_onFavouritesChanged); - settings.addListener(_onSettingsChanged); + settings.removeListener(_onSettingsChanged); super.dispose(); } diff --git a/lib/widgets/collection/collection_grid.dart b/lib/widgets/collection/collection_grid.dart index 88c618791..88f40a028 100644 --- a/lib/widgets/collection/collection_grid.dart +++ b/lib/widgets/collection/collection_grid.dart @@ -48,6 +48,12 @@ class CollectionGrid extends StatefulWidget { class _CollectionGridState extends State { TileExtentController? _tileExtentController; + @override + void dispose() { + _tileExtentController?.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { _tileExtentController ??= TileExtentController( diff --git a/lib/widgets/common/tile_extent_controller.dart b/lib/widgets/common/tile_extent_controller.dart index 5ee44678b..1e39af61e 100644 --- a/lib/widgets/common/tile_extent_controller.dart +++ b/lib/widgets/common/tile_extent_controller.dart @@ -10,6 +10,7 @@ class TileExtentController { final double spacing, extentMin, extentMax; final ValueNotifier extentNotifier = ValueNotifier(0); + late double userPreferredExtent; Size _viewportSize = Size.zero; Size get viewportSize => _viewportSize; @@ -21,7 +22,20 @@ class TileExtentController { required this.extentMin, this.extentMax = 300, required this.spacing, - }); + }) { + userPreferredExtent = settings.getTileExtent(settingsRouteKey); + settings.addListener(_onSettingsChanged); + } + + void dispose() { + settings.removeListener(_onSettingsChanged); + } + + void _onSettingsChanged() { + if (userPreferredExtent != settings.getTileExtent(settingsRouteKey)) { + _update(); + } + } void setViewportSize(Size viewportSize) { // sanitize screen size (useful when reloading while screen is off, reporting a 0,0 size) @@ -35,22 +49,18 @@ class TileExtentController { } } - double setUserPreferredExtent(double userPreferredExtent) => _update(userPreferredExtent: userPreferredExtent); + double setUserPreferredExtent(double extent) => _update(userPreferredExtent: extent.roundToDouble()); - double _update({double userPreferredExtent = 0}) { - final oldUserPreferredExtent = settings.getTileExtent(settingsRouteKey); - final currentExtent = extentNotifier.value; - final targetExtent = userPreferredExtent > 0 - ? userPreferredExtent - : oldUserPreferredExtent > 0 - ? oldUserPreferredExtent - : currentExtent; + double _update({double? userPreferredExtent}) { + final preferredExtent = userPreferredExtent ?? settings.getTileExtent(settingsRouteKey); + final targetExtent = preferredExtent > 0 ? preferredExtent : extentNotifier.value; final columnCount = _effectiveColumnCountForExtent(targetExtent); final newExtent = _extentForColumnCount(columnCount); - if (userPreferredExtent > 0 || oldUserPreferredExtent == 0) { - settings.setTileExtent(settingsRouteKey, newExtent); + if (this.userPreferredExtent != preferredExtent) { + this.userPreferredExtent = preferredExtent; + settings.setTileExtent(settingsRouteKey, preferredExtent); } if (extentNotifier.value != newExtent) { extentNotifier.value = newExtent; diff --git a/lib/widgets/filter_grids/common/filter_grid_page.dart b/lib/widgets/filter_grids/common/filter_grid_page.dart index 539612342..5ac48b158 100644 --- a/lib/widgets/filter_grids/common/filter_grid_page.dart +++ b/lib/widgets/filter_grids/common/filter_grid_page.dart @@ -133,6 +133,12 @@ class FilterGrid extends StatefulWidget { class _FilterGridState extends State> { TileExtentController? _tileExtentController; + @override + void dispose() { + _tileExtentController?.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { _tileExtentController ??= TileExtentController( diff --git a/lib/widgets/search/search_page.dart b/lib/widgets/search/search_page.dart index 2d182a66d..c6abff1dc 100644 --- a/lib/widgets/search/search_page.dart +++ b/lib/widgets/search/search_page.dart @@ -37,12 +37,12 @@ class _SearchPageState extends State { @override void dispose() { - super.dispose(); widget.delegate.queryTextController.removeListener(_onQueryChanged); widget.animation.removeStatusListener(_onAnimationStatusChanged); widget.delegate.currentBodyNotifier.removeListener(_onSearchBodyChanged); widget.delegate.focusNode = null; _focusNode.dispose(); + super.dispose(); } void _onAnimationStatusChanged(AnimationStatus status) { diff --git a/lib/widgets/viewer/info/maps/google_map.dart b/lib/widgets/viewer/info/maps/google_map.dart index 267f949ef..74744ba68 100644 --- a/lib/widgets/viewer/info/maps/google_map.dart +++ b/lib/widgets/viewer/info/maps/google_map.dart @@ -53,8 +53,8 @@ class _EntryGoogleMapState extends State { @override void dispose() { - super.dispose(); _controller?.dispose(); + super.dispose(); } @override