From bf91ee0c0771f22e9831a9c687d6fcbfaecd9009 Mon Sep 17 00:00:00 2001 From: Luka S Date: Sat, 28 Sep 2024 21:37:39 +0100 Subject: [PATCH] fix: eagerly listen to `TileLayer.reset` stream to ensure handler is fired (#1943) --- lib/src/layer/tile_layer/tile_layer.dart | 25 ++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/lib/src/layer/tile_layer/tile_layer.dart b/lib/src/layer/tile_layer/tile_layer.dart index b7067613b..ab383a85e 100644 --- a/lib/src/layer/tile_layer/tile_layer.dart +++ b/lib/src/layer/tile_layer/tile_layer.dart @@ -332,8 +332,7 @@ class _TileLayerState extends State with TickerProviderStateMixin { final _tileImageManager = TileImageManager(); late TileBounds _tileBounds; - late var _tileRangeCalculator = - TileRangeCalculator(tileSize: widget.tileSize); + late TileRangeCalculator _tileRangeCalculator; late TileScaleCalculator _tileScaleCalculator; // We have to hold on to the mapController hashCode to determine whether we @@ -345,10 +344,14 @@ class _TileLayerState extends State with TickerProviderStateMixin { StreamSubscription? _tileUpdateSubscription; Timer? _pruneLater; - late final _resetSub = widget.reset?.listen((_) { - _tileImageManager.removeAll(widget.evictErrorTileStrategy); - if (mounted) _loadAndPruneInVisibleBounds(MapCamera.of(context)); - }); + StreamSubscription? _resetSub; + + @override + void initState() { + super.initState(); + _resetSub = widget.reset?.listen(_resetStreamHandler); + _tileRangeCalculator = TileRangeCalculator(tileSize: widget.tileSize); + } // This is called on every map movement so we should avoid expensive logic // where possible, or filter as necessary @@ -452,6 +455,11 @@ class _TileLayerState extends State with TickerProviderStateMixin { } else if (oldWidget.tileDisplay != widget.tileDisplay) { _tileImageManager.updateTileDisplay(widget.tileDisplay); } + + if (widget.reset != oldWidget.reset) { + _resetSub?.cancel(); + _resetSub = widget.reset?.listen(_resetStreamHandler); + } } @override @@ -707,6 +715,11 @@ class _TileLayerState extends State with TickerProviderStateMixin { bool _outsideZoomLimits(num zoom) => zoom < widget.minZoom || zoom > widget.maxZoom; + + void _resetStreamHandler(void _) { + _tileImageManager.removeAll(widget.evictErrorTileStrategy); + if (mounted) _loadAndPruneInVisibleBounds(MapCamera.of(context)); + } } double _distanceSq(TileCoordinates coord, Point center) {