Skip to content

Commit 8e435bf

Browse files
fix: replace unstable ObjectKey(tileRenderer) with stable TileKey
1 parent c5e4909 commit 8e435bf

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import 'package:flutter/foundation.dart';
2+
import 'package:flutter_map/src/layer/tile_layer/tile_coordinates.dart';
3+
import 'package:flutter_map/src/layer/tile_layer/tile_image.dart';
4+
import 'package:flutter_map/src/layer/tile_layer/tile_renderer.dart';
5+
6+
/// A key that identifies rendering of a [TileImage] at given [TileCoordinates].
7+
///
8+
/// Two [TileKey]s are equal when they reference the same [TileImage]
9+
/// instance and have equal [positionCoordinates].
10+
final class TileKey extends LocalKey {
11+
/// Tile image to identify by instance.
12+
final TileImage tileImage;
13+
14+
/// Position where [tileImage] is rendered.
15+
final TileCoordinates positionCoordinates;
16+
17+
/// Creates a [TileKey] for the given [TileRenderer].
18+
///
19+
/// The [tileImage] is compared by identity, while [positionCoordinates] are
20+
/// compared by value.
21+
TileKey(TileRenderer renderer)
22+
: tileImage = renderer.tileImage,
23+
positionCoordinates = renderer.positionCoordinates;
24+
25+
@override
26+
bool operator ==(Object other) {
27+
return other is TileKey &&
28+
identical(other.tileImage, tileImage) &&
29+
other.positionCoordinates == positionCoordinates;
30+
}
31+
32+
@override
33+
int get hashCode => Object.hash(
34+
identityHashCode(tileImage),
35+
positionCoordinates,
36+
);
37+
}

lib/src/layer/tile_layer/tile_layer.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:flutter_map/src/layer/tile_layer/tile.dart';
99
import 'package:flutter_map/src/layer/tile_layer/tile_bounds/tile_bounds.dart';
1010
import 'package:flutter_map/src/layer/tile_layer/tile_bounds/tile_bounds_at_zoom.dart';
1111
import 'package:flutter_map/src/layer/tile_layer/tile_image_manager.dart';
12+
import 'package:flutter_map/src/layer/tile_layer/tile_key.dart';
1213
import 'package:flutter_map/src/layer/tile_layer/tile_range.dart';
1314
import 'package:flutter_map/src/layer/tile_layer/tile_range_calculator.dart';
1415
import 'package:flutter_map/src/layer/tile_layer/tile_scale_calculator.dart';
@@ -561,7 +562,7 @@ class _TileLayerState extends State<TileLayer> with TickerProviderStateMixin {
561562
.map((tileRenderer) => Tile(
562563
// Must be an ObjectKey, not a ValueKey using the coordinates, in
563564
// case we remove and replace the TileImage with a different one.
564-
key: ObjectKey(tileRenderer),
565+
key: TileKey(tileRenderer),
565566
scaledTileDimension: _tileScaleCalculator.scaledTileDimension(
566567
map.zoom,
567568
tileRenderer.positionCoordinates.z,

0 commit comments

Comments
 (0)