diff --git a/lib/src/layer/tile_layer/tile_key.dart b/lib/src/layer/tile_layer/tile_key.dart new file mode 100644 index 000000000..fed8d1d75 --- /dev/null +++ b/lib/src/layer/tile_layer/tile_key.dart @@ -0,0 +1,37 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter_map/src/layer/tile_layer/tile_coordinates.dart'; +import 'package:flutter_map/src/layer/tile_layer/tile_image.dart'; +import 'package:flutter_map/src/layer/tile_layer/tile_renderer.dart'; + +/// A key that identifies rendering of a [TileImage] at given [TileCoordinates]. +/// +/// Two [TileKey]s are equal when they reference the same [TileImage] +/// instance and have equal [positionCoordinates]. +final class TileKey extends LocalKey { + /// Tile image to identify by instance. + final TileImage tileImage; + + /// Position where [tileImage] is rendered. + final TileCoordinates positionCoordinates; + + /// Creates a [TileKey] for the given [TileRenderer]. + /// + /// The [tileImage] is compared by identity, while [positionCoordinates] are + /// compared by value. + TileKey(TileRenderer renderer) + : tileImage = renderer.tileImage, + positionCoordinates = renderer.positionCoordinates; + + @override + bool operator ==(Object other) { + return other is TileKey && + identical(other.tileImage, tileImage) && + other.positionCoordinates == positionCoordinates; + } + + @override + int get hashCode => Object.hash( + identityHashCode(tileImage), + positionCoordinates, + ); +} diff --git a/lib/src/layer/tile_layer/tile_layer.dart b/lib/src/layer/tile_layer/tile_layer.dart index f7086f658..c6100c40a 100644 --- a/lib/src/layer/tile_layer/tile_layer.dart +++ b/lib/src/layer/tile_layer/tile_layer.dart @@ -9,6 +9,7 @@ import 'package:flutter_map/src/layer/tile_layer/tile.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_bounds/tile_bounds.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_bounds/tile_bounds_at_zoom.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_image_manager.dart'; +import 'package:flutter_map/src/layer/tile_layer/tile_key.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_range.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_range_calculator.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_scale_calculator.dart'; @@ -560,7 +561,7 @@ class _TileLayerState extends State with TickerProviderStateMixin { .map((tileRenderer) => Tile( // Must be an ObjectKey, not a ValueKey using the coordinates, in // case we remove and replace the TileImage with a different one. - key: ObjectKey(tileRenderer), + key: TileKey(tileRenderer), scaledTileDimension: _tileScaleCalculator.scaledTileDimension( map.zoom, tileRenderer.positionCoordinates.z,