diff --git a/lib/src/layer/tile_layer/tile_bounds/tile_bounds_at_zoom.dart b/lib/src/layer/tile_layer/tile_bounds/tile_bounds_at_zoom.dart index fbab3f14c..3f6127b32 100644 --- a/lib/src/layer/tile_layer/tile_bounds/tile_bounds_at_zoom.dart +++ b/lib/src/layer/tile_layer/tile_bounds/tile_bounds_at_zoom.dart @@ -1,5 +1,3 @@ -import 'dart:math'; - import 'package:flutter_map/src/layer/tile_layer/tile_coordinates.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_range.dart'; import 'package:meta/meta.dart'; @@ -112,12 +110,11 @@ class WrappedTileBoundsAtZoom extends TileBoundsAtZoom { } bool _wrappedBothContains(TileCoordinates coordinates) { - return tileRange.contains( - Point( - _wrapInt(coordinates.x, wrapX!), - _wrapInt(coordinates.y, wrapY!), - ), - ); + return tileRange.contains(TileCoordinates( + _wrapInt(coordinates.x, wrapX!), + _wrapInt(coordinates.y, wrapY!), + coordinates.z, + )); } bool _wrappedXInRange(TileCoordinates coordinates) { diff --git a/lib/src/layer/tile_layer/tile_coordinates.dart b/lib/src/layer/tile_layer/tile_coordinates.dart index 7b0ebe122..81fb83385 100644 --- a/lib/src/layer/tile_layer/tile_coordinates.dart +++ b/lib/src/layer/tile_layer/tile_coordinates.dart @@ -8,8 +8,6 @@ class TileCoordinates extends Point { const TileCoordinates(super.x, super.y, this.z); - String get key => '$x:$y:$z'; - @override String toString() => 'TileCoordinate($x, $y, $z)'; @@ -32,5 +30,8 @@ class TileCoordinates extends Point { } @override - int get hashCode => Object.hash(x.hashCode, y.hashCode, z.hashCode); + int get hashCode { + // NOTE: the odd numbers are due to JavaScript's integer precision of 53 bits. + return x | y << 24 | z << 48; + } } diff --git a/lib/src/layer/tile_layer/tile_image.dart b/lib/src/layer/tile_layer/tile_image.dart index 8aeeb44f9..a469d5099 100644 --- a/lib/src/layer/tile_layer/tile_image.dart +++ b/lib/src/layer/tile_layer/tile_image.dart @@ -83,7 +83,7 @@ class TileImage extends ChangeNotifier { AnimationController? get animation => _animationController; - String get coordinatesKey => coordinates.key; + TileCoordinates get coordinatesKey => coordinates; /// Whether the tile is displayable. This means that either: /// * Loading errored but an error image is configured. diff --git a/lib/src/layer/tile_layer/tile_image_manager.dart b/lib/src/layer/tile_layer/tile_image_manager.dart index bc7130895..04ca232eb 100644 --- a/lib/src/layer/tile_layer/tile_image_manager.dart +++ b/lib/src/layer/tile_layer/tile_image_manager.dart @@ -13,10 +13,10 @@ typedef TileCreator = TileImage Function(TileCoordinates coordinates); @immutable class TileImageManager { - final Map _tiles = {}; + final Map _tiles = {}; bool containsTileAt(TileCoordinates coordinates) => - _tiles.containsKey(coordinates.key); + _tiles.containsKey(coordinates); bool get allLoaded => _tiles.values.none((tile) => tile.loadFinishedAt == null); @@ -44,7 +44,7 @@ class TileImageManager { }) { for (final coordinates in tileBoundsAtZoom.validCoordinatesIn(tileRange)) { _tiles.putIfAbsent( - coordinates.key, + coordinates, () => createTileImage(coordinates), ); } @@ -64,7 +64,7 @@ class TileImageManager { for (final coordinates in tileCoordinates) { final tile = _tiles.putIfAbsent( - coordinates.key, + coordinates, () => createTile(coordinates), ); @@ -83,7 +83,7 @@ class TileImageManager { /// All removals should be performed by calling this method to ensure that // disposal is performed correctly. void _remove( - String key, { + TileCoordinates key, { required bool Function(TileImage tileImage) evictImageFromCache, }) { final removed = _tiles.remove(key); @@ -94,7 +94,7 @@ class TileImageManager { } void _removeWithEvictionStrategy( - String key, + TileCoordinates key, EvictErrorTileStrategy strategy, ) { _remove( @@ -105,7 +105,7 @@ class TileImageManager { } void removeAll(EvictErrorTileStrategy evictStrategy) { - final keysToRemove = List.from(_tiles.keys); + final keysToRemove = List.from(_tiles.keys); for (final key in keysToRemove) { _removeWithEvictionStrategy(key, evictStrategy); diff --git a/lib/src/layer/tile_layer/tile_image_view.dart b/lib/src/layer/tile_layer/tile_image_view.dart index 7aca827e2..684288530 100644 --- a/lib/src/layer/tile_layer/tile_image_view.dart +++ b/lib/src/layer/tile_layer/tile_image_view.dart @@ -5,12 +5,12 @@ import 'package:flutter_map/src/layer/tile_layer/tile_image.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_range.dart'; class TileImageView { - final Map _tileImages; + final Map _tileImages; final DiscreteTileRange _visibleRange; final DiscreteTileRange _keepRange; TileImageView({ - required Map tileImages, + required Map tileImages, required DiscreteTileRange visibleRange, required DiscreteTileRange keepRange, }) : _tileImages = UnmodifiableMapView(tileImages), @@ -62,7 +62,7 @@ class TileImageView { final z2 = z - 1; final coords2 = TileCoordinates(x2, y2, z2); - final tile = _tileImages[coords2.key]; + final tile = _tileImages[coords2]; if (tile != null) { if (tile.readyToDisplay) { retain.add(tile); @@ -92,7 +92,7 @@ class TileImageView { for (var j = 2 * y; j < 2 * y + 2; j++) { final coords = TileCoordinates(i, j, z + 1); - final tile = _tileImages[coords.key]; + final tile = _tileImages[coords]; if (tile != null) { if (tile.readyToDisplay || tile.loadFinishedAt != null) { retain.add(tile); diff --git a/test/layer/tile_layer/tile_image_view_test.dart b/test/layer/tile_layer/tile_image_view_test.dart index e9d3d9475..d9d65294e 100644 --- a/test/layer/tile_layer/tile_image_view_test.dart +++ b/test/layer/tile_layer/tile_image_view_test.dart @@ -13,18 +13,18 @@ import 'package:test/test.dart'; import '../../test_utils/test_tile_image.dart'; void main() { - Map tileImagesMappingFrom(List tileImages) => { - for (final tileImage in tileImages) tileImage.coordinates.key: tileImage - }; + Map tileImagesMappingFrom( + List tileImages) => + {for (final tileImage in tileImages) tileImage.coordinates: tileImage}; Matcher containsTileImage( - Map tileImages, + Map tileImages, TileCoordinates coordinates, ) => - contains(tileImages[coordinates.key]); + contains(tileImages[coordinates]); Matcher doesNotContainTileImage( - Map tileImages, + Map tileImages, TileCoordinates coordinates, ) => isNot(containsTileImage(tileImages, coordinates));