Skip to content

Commit 7c973e9

Browse files
perf: replace unstable Tile widget key with dedicated stable TileKey (#2195)
1 parent cde93c8 commit 7c973e9

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';
@@ -560,7 +561,7 @@ class _TileLayerState extends State<TileLayer> with TickerProviderStateMixin {
560561
.map((tileRenderer) => Tile(
561562
// Must be an ObjectKey, not a ValueKey using the coordinates, in
562563
// case we remove and replace the TileImage with a different one.
563-
key: ObjectKey(tileRenderer),
564+
key: TileKey(tileRenderer),
564565
scaledTileDimension: _tileScaleCalculator.scaledTileDimension(
565566
map.zoom,
566567
tileRenderer.positionCoordinates.z,

0 commit comments

Comments
 (0)