@@ -7,13 +7,11 @@ import 'package:flutter_map/src/layer/tile_layer/tile_bounds/tile_bounds_at_zoom
77import 'package:flutter_map/src/layer/tile_layer/tile_image_view.dart' ;
88import 'package:flutter_map/src/layer/tile_layer/tile_range.dart' ;
99import 'package:flutter_map/src/layer/tile_layer/tile_renderer.dart' ;
10- import 'package:meta/meta.dart' ;
1110
12- /// Callback definition to crete a [TileImage] for [TileCoordinates] .
11+ /// Callback definition to create a [TileImage] for [TileCoordinates] .
1312typedef TileCreator = TileImage Function (TileCoordinates coordinates);
1413
1514/// The [TileImageManager] orchestrates the loading and pruning of tiles.
16- @immutable
1715class TileImageManager {
1816 final Set <TileCoordinates > _positionCoordinates = HashSet <TileCoordinates >();
1917
@@ -28,31 +26,52 @@ class TileImageManager {
2826 bool get allLoaded =>
2927 _tiles.values.none ((tile) => tile.loadFinishedAt == null );
3028
29+ /// Coordinates resolver.
30+ TileCoordinatesResolver _resolver = const TileCoordinatesResolver (false );
31+
32+ /// Sets if we replicate the world longitude in several worlds.
33+ void setReplicatesWorldLongitude (bool replicatesWorldLongitude) {
34+ if (_resolver.replicatesWorldLongitude == replicatesWorldLongitude) {
35+ return ;
36+ }
37+ _resolver = TileCoordinatesResolver (replicatesWorldLongitude);
38+ }
39+
3140 /// Filter tiles to only tiles that would be visible on screen. Specifically:
3241 /// 1. Tiles in the visible range at the target zoom level.
3342 /// 2. Tiles at non-target zoom level that would cover up holes that would
3443 /// be left by tiles in #1, which are not ready yet.
3544 Iterable <TileRenderer > getTilesToRender ({
3645 required DiscreteTileRange visibleRange,
3746 }) {
38- final Iterable <TileCoordinates > positionCoordinates = TileImageView (
39- tileImages: _tiles,
40- positionCoordinates: _positionCoordinates,
47+ final Iterable <TileCoordinates > positionCoordinates = _getTileImageView (
4148 visibleRange: visibleRange,
4249 // `keepRange` is irrelevant here since we're not using the output for
4350 // pruning storage but rather to decide on what to put on screen.
4451 keepRange: visibleRange,
4552 ).renderTiles;
4653 final List <TileRenderer > tileRenderers = < TileRenderer > [];
4754 for (final position in positionCoordinates) {
48- final TileImage ? tileImage = _tiles[TileCoordinates . key (position)];
55+ final TileImage ? tileImage = _tiles[_resolver. get (position)];
4956 if (tileImage != null ) {
5057 tileRenderers.add (TileRenderer (tileImage, position));
5158 }
5259 }
5360 return tileRenderers;
5461 }
5562
63+ TileImageView _getTileImageView ({
64+ required DiscreteTileRange visibleRange,
65+ required DiscreteTileRange keepRange,
66+ }) =>
67+ TileImageView (
68+ tileImages: _tiles,
69+ positionCoordinates: _positionCoordinates,
70+ visibleRange: visibleRange,
71+ keepRange: keepRange,
72+ resolver: _resolver,
73+ );
74+
5675 /// Check if all loaded tiles are within the [minZoom] and [maxZoom] level.
5776 bool allWithinZoom (double minZoom, double maxZoom) => _tiles.values
5877 .map ((e) => e.coordinates)
@@ -68,7 +87,7 @@ class TileImageManager {
6887 final notLoaded = < TileImage > [];
6988
7089 for (final coordinates in tileBoundsAtZoom.validCoordinatesIn (tileRange)) {
71- final cleanCoordinates = TileCoordinates . key (coordinates);
90+ final cleanCoordinates = _resolver. get (coordinates);
7291 TileImage ? tile = _tiles[cleanCoordinates];
7392 if (tile == null ) {
7493 tile = createTile (cleanCoordinates);
@@ -97,11 +116,11 @@ class TileImageManager {
97116 required bool Function (TileImage tileImage) evictImageFromCache,
98117 }) {
99118 _positionCoordinates.remove (key);
100- final cleanKey = TileCoordinates . key (key);
119+ final cleanKey = _resolver. get (key);
101120
102121 // guard if positionCoordinates with the same tileImage.
103122 for (final positionCoordinates in _positionCoordinates) {
104- if (TileCoordinates . key (positionCoordinates) == cleanKey) {
123+ if (_resolver. get (positionCoordinates) == cleanKey) {
105124 return ;
106125 }
107126 }
@@ -167,9 +186,7 @@ class TileImageManager {
167186 required int pruneBuffer,
168187 required EvictErrorTileStrategy evictStrategy,
169188 }) {
170- final pruningState = TileImageView (
171- tileImages: _tiles,
172- positionCoordinates: _positionCoordinates,
189+ final pruningState = _getTileImageView (
173190 visibleRange: visibleRange,
174191 keepRange: visibleRange.expand (pruneBuffer),
175192 );
@@ -205,9 +222,7 @@ class TileImageManager {
205222 required EvictErrorTileStrategy evictStrategy,
206223 }) {
207224 _prune (
208- TileImageView (
209- tileImages: _tiles,
210- positionCoordinates: _positionCoordinates,
225+ _getTileImageView (
211226 visibleRange: visibleRange,
212227 keepRange: visibleRange.expand (pruneBuffer),
213228 ),
0 commit comments