From c12405a44b2c4d6184ab4d3a682247e197a368a2 Mon Sep 17 00:00:00 2001 From: JaffaKetchup Date: Sun, 2 Feb 2025 15:35:26 +0000 Subject: [PATCH 1/5] Changed parameters for `provideTile` to support vector tiles in future and remove unnecessary parameters --- .../download_progress_masker.dart | 2 +- .../providers/image_provider/image_provider.dart | 11 +++++------ .../image_provider/internal_tile_browser.dart | 4 +--- lib/src/providers/tile_provider/tile_provider.dart | 14 ++++++++------ 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/example/lib/src/screens/main/map_view/components/download_progress/download_progress_masker.dart b/example/lib/src/screens/main/map_view/components/download_progress/download_progress_masker.dart index 597cc019..baad5862 100644 --- a/example/lib/src/screens/main/map_view/components/download_progress/download_progress_masker.dart +++ b/example/lib/src/screens/main/map_view/components/download_progress/download_progress_masker.dart @@ -28,7 +28,7 @@ class DownloadProgressMasker extends StatefulWidget { final int minZoom; final int maxZoom; final int tileSize; - final TileLayer child; + final Widget child; // To reset after a download, the `key` must be changed diff --git a/lib/src/providers/image_provider/image_provider.dart b/lib/src/providers/image_provider/image_provider.dart index bdad0f15..30880401 100644 --- a/lib/src/providers/image_provider/image_provider.dart +++ b/lib/src/providers/image_provider/image_provider.dart @@ -46,7 +46,7 @@ class _FMTCImageProvider extends ImageProvider<_FMTCImageProvider> { MultiFrameImageStreamCompleter( codec: provideTile( coords: coords, - options: options, + networkUrl: provider.getTileUrl(coords, options), provider: provider, key: key, finishedLoadingBytes: finishedLoadingBytes, @@ -72,9 +72,9 @@ class _FMTCImageProvider extends ImageProvider<_FMTCImageProvider> { /// {@macro fmtc.tileProvider.provideTile} static Future provideTile({ - required TileCoordinates coords, - required TileLayer options, + required String networkUrl, required FMTCTileProvider provider, + TileCoordinates? coords, Object? key, void Function()? startedLoading, void Function()? finishedLoadingBytes, @@ -92,7 +92,7 @@ class _FMTCImageProvider extends ImageProvider<_FMTCImageProvider> { scheduleMicrotask(() => PaintingBinding.instance.imageCache.evict(key)); } - if (currentTLIR != null) { + if (currentTLIR != null && coords != null) { currentTLIR.error = error; provider.tileLoadingInterceptor! @@ -121,8 +121,7 @@ class _FMTCImageProvider extends ImageProvider<_FMTCImageProvider> { final Uint8List bytes; try { bytes = await _internalTileBrowser( - coords: coords, - options: options, + networkUrl: networkUrl, provider: provider, requireValidImage: requireValidImage, currentTLIR: currentTLIR, diff --git a/lib/src/providers/image_provider/internal_tile_browser.dart b/lib/src/providers/image_provider/internal_tile_browser.dart index 393242d2..8ff49be2 100644 --- a/lib/src/providers/image_provider/internal_tile_browser.dart +++ b/lib/src/providers/image_provider/internal_tile_browser.dart @@ -4,8 +4,7 @@ part of '../../../flutter_map_tile_caching.dart'; Future _internalTileBrowser({ - required TileCoordinates coords, - required TileLayer options, + required String networkUrl, required FMTCTileProvider provider, required bool requireValidImage, required _TLIRConstructor? currentTLIR, @@ -27,7 +26,6 @@ Future _internalTileBrowser({ } } - final networkUrl = provider.getTileUrl(coords, options); final matcherUrl = provider.urlTransformer?.call(networkUrl) ?? networkUrl; currentTLIR?.networkUrl = networkUrl; diff --git a/lib/src/providers/tile_provider/tile_provider.dart b/lib/src/providers/tile_provider/tile_provider.dart index a183fffb..62ea6cfa 100644 --- a/lib/src/providers/tile_provider/tile_provider.dart +++ b/lib/src/providers/tile_provider/tile_provider.dart @@ -300,9 +300,7 @@ class FMTCTileProvider extends TileProvider { } /// {@template fmtc.tileProvider.provideTile} - /// Use FMTC's caching logic to get the bytes of the specific tile (at - /// [coords]) with the specified [TileLayer] options and [FMTCTileProvider] - /// provider + /// Use FMTC's caching logic to get the bytes of the tile at [networkUrl] /// /// > [!IMPORTANT] /// > Note that this will actuate the cache writing mechanism as if a normal @@ -321,6 +319,10 @@ class FMTCTileProvider extends TileProvider { /// /// --- /// + /// [coords] is required to enable functioning of + /// [FMTCTileProvider.tileLoadingInterceptor]. If the tile loading interceptor + /// is not in use, providing coordinates is not necessary. + /// /// [key] is used to control the [ImageCache], and should be set when in a /// context where [ImageProvider.obtainKey] is available. /// @@ -342,8 +344,8 @@ class FMTCTileProvider extends TileProvider { /// to be decoded (now or at a later time). /// {@endtemplate} Future provideTile({ - required TileCoordinates coords, - required TileLayer options, + required String networkUrl, + TileCoordinates? coords, Object? key, void Function()? startedLoading, void Function()? finishedLoadingBytes, @@ -351,7 +353,7 @@ class FMTCTileProvider extends TileProvider { }) => _FMTCImageProvider.provideTile( coords: coords, - options: options, + networkUrl: networkUrl, provider: this, key: key, startedLoading: startedLoading, From 503593eb28a30ab1a58220cb1ea171d43b1b5c38 Mon Sep 17 00:00:00 2001 From: JaffaKetchup Date: Wed, 5 Mar 2025 22:46:26 +0000 Subject: [PATCH 2/5] Replaced `TileLayer options` property with `String networkUrl` in image provider Fixed equality in image provider to ensure changes to tile layer URL template make tiles update (breaks tile image cache keys when URL changes) --- .../image_provider/image_provider.dart | 45 ++++++++++--------- .../tile_provider/tile_provider.dart | 6 +-- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/lib/src/providers/image_provider/image_provider.dart b/lib/src/providers/image_provider/image_provider.dart index 30880401..e696f407 100644 --- a/lib/src/providers/image_provider/image_provider.dart +++ b/lib/src/providers/image_provider/image_provider.dart @@ -10,22 +10,28 @@ class _FMTCImageProvider extends ImageProvider<_FMTCImageProvider> { /// Create a specialised [ImageProvider] that uses FMTC internals to enable /// browse caching const _FMTCImageProvider({ - required this.provider, - required this.options, + required this.networkUrl, required this.coords, + required this.provider, required this.startedLoading, required this.finishedLoadingBytes, }); - /// An instance of the [FMTCTileProvider] in use - final FMTCTileProvider provider; - - /// An instance of the [TileLayer] in use - final TileLayer options; + /// The network URL of the tile at [coords], determined by + /// [FMTCTileProvider.getTileUrl] + final String networkUrl; /// The coordinates of the tile to be fetched + /// + /// Must be set when using the image provider - acts as a key for + /// [FMTCTileProvider.tileLoadingInterceptor], and is used for some debug + /// info. Optional when [provideTile] is used directly, if + /// `tileLoadingInterceptor` functionality is not used. final TileCoordinates coords; + /// An instance of the [FMTCTileProvider] in use + final FMTCTileProvider provider; + /// Function invoked when the image starts loading (not from cache) /// /// Used with [finishedLoadingBytes] to safely dispose of the `httpClient` @@ -46,7 +52,7 @@ class _FMTCImageProvider extends ImageProvider<_FMTCImageProvider> { MultiFrameImageStreamCompleter( codec: provideTile( coords: coords, - networkUrl: provider.getTileUrl(coords, options), + networkUrl: networkUrl, provider: provider, key: key, finishedLoadingBytes: finishedLoadingBytes, @@ -55,19 +61,15 @@ class _FMTCImageProvider extends ImageProvider<_FMTCImageProvider> { ).then(ImmutableBuffer.fromUint8List).then((v) => decode(v)), scale: 1, debugLabel: coords.toString(), - informationCollector: () { - final tileUrl = provider.getTileUrl(coords, options); - - return [ - DiagnosticsProperty('Stores', provider.stores), - DiagnosticsProperty('Tile coordinates', coords), - DiagnosticsProperty('Tile URL', tileUrl), - DiagnosticsProperty( - 'Tile storage-suitable UID', - provider.urlTransformer?.call(tileUrl) ?? tileUrl, - ), - ]; - }, + informationCollector: () => [ + DiagnosticsProperty('Stores', provider.stores), + DiagnosticsProperty('Tile coordinates', coords), + DiagnosticsProperty('Tile URL', networkUrl), + DiagnosticsProperty( + 'Tile storage-suitable UID', + provider.urlTransformer?.call(networkUrl) ?? networkUrl, + ), + ], ); /// {@macro fmtc.tileProvider.provideTile} @@ -149,6 +151,7 @@ class _FMTCImageProvider extends ImageProvider<_FMTCImageProvider> { bool operator ==(Object other) => identical(this, other) || (other is _FMTCImageProvider && + other.networkUrl == networkUrl && other.coords == coords && other.provider == provider); diff --git a/lib/src/providers/tile_provider/tile_provider.dart b/lib/src/providers/tile_provider/tile_provider.dart index 62ea6cfa..4117aa5f 100644 --- a/lib/src/providers/tile_provider/tile_provider.dart +++ b/lib/src/providers/tile_provider/tile_provider.dart @@ -278,9 +278,9 @@ class FMTCTileProvider extends TileProvider { @override ImageProvider getImage(TileCoordinates coordinates, TileLayer options) => _FMTCImageProvider( - provider: this, - options: options, + networkUrl: getTileUrl(coordinates, options), coords: coordinates, + provider: this, startedLoading: () => _tilesInProgress[coordinates] = Completer(), finishedLoadingBytes: () { _tilesInProgress[coordinates]?.complete(); @@ -352,8 +352,8 @@ class FMTCTileProvider extends TileProvider { bool requireValidImage = false, }) => _FMTCImageProvider.provideTile( - coords: coords, networkUrl: networkUrl, + coords: coords, provider: this, key: key, startedLoading: startedLoading, From e61b420aeb74a76a46b09223b61c93ef2d48c363 Mon Sep 17 00:00:00 2001 From: JaffaKetchup Date: Sun, 9 Mar 2025 16:59:56 +0000 Subject: [PATCH 3/5] Updated dependencies --- example/pubspec.yaml | 24 +++++++++++------------- pubspec.yaml | 14 +++++++------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/example/pubspec.yaml b/example/pubspec.yaml index e1facc1d..a65c655e 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -8,32 +8,30 @@ environment: flutter: ">=3.27.0" dependencies: - async: ^2.12.0 + async: ^2.13.0 auto_size_text: ^3.0.0 badges: ^3.1.2 - collection: ^1.18.0 - file_picker: 8.1.4 # Compatible with 3.27! + collection: ^1.19.1 + file_picker: ^9.0.2 flutter: sdk: flutter - flutter_map: - flutter_map_animations: ^0.8.0 + flutter_map: ^8.1.1 + flutter_map_animations: ^0.9.0 flutter_map_tile_caching: - flutter_slidable: ^3.1.2 + flutter_slidable: ^4.0.0 google_fonts: ^6.2.1 gpx: ^2.3.0 - http: ^1.2.2 - intl: ^0.19.0 + http: ^1.3.0 + intl: ^0.20.2 latlong2: ^0.9.1 path: ^1.9.1 path_provider: ^2.1.5 provider: ^6.1.2 - share_plus: ^10.1.3 - shared_preferences: ^2.3.3 - stream_transform: ^2.1.0 + share_plus: ^10.1.4 + shared_preferences: ^2.5.2 + stream_transform: ^2.1.1 dependency_overrides: - flutter_map: - git: https://github.com/fleaflet/flutter_map.git flutter_map_tile_caching: path: ../ diff --git a/pubspec.yaml b/pubspec.yaml index 8b2d8ec4..8b7aaec8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -33,19 +33,19 @@ dependencies: flat_buffers: ^23.5.26 flutter: sdk: flutter - flutter_map: ^8.0.0 + flutter_map: ^8.1.1 http: ^1.2.2 latlong2: ^0.9.1 meta: ^1.15.0 - objectbox: ^4.0.3 - objectbox_flutter_libs: ^4.0.3 + objectbox: ^4.1.0 + objectbox_flutter_libs: ^4.1.0 path: ^1.9.0 - path_provider: ^2.1.4 + path_provider: ^2.1.5 dev_dependencies: - build_runner: ^2.4.14 - objectbox_generator: ^4.0.3 - test: ^1.25.14 + build_runner: ^2.4.15 + objectbox_generator: ^4.1.0 + test: ^1.25.15 flutter: null From b81e4dd23d913b1c39623f6e200a6f5cf6c1a286 Mon Sep 17 00:00:00 2001 From: JaffaKetchup Date: Sun, 9 Mar 2025 17:10:47 +0000 Subject: [PATCH 4/5] Bump to v11 prerelease Updated CHANGELOG --- CHANGELOG.md | 6 ++++++ example/pubspec.yaml | 2 +- lib/src/providers/image_provider/image_provider.dart | 2 +- pubspec.yaml | 2 +- windowsApplicationInstallerSetup.iss | 2 +- 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 433138db..5ff58650 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,12 @@ Many thanks to my sponsors, no matter how much or how little they donated. Spons # Changelog +## [11.0.0-dev.1] - 2025/03/09 + +* Change `FMTCTileProvider.provideTile` arguments + Require a tile's URL & optional coordinates; instead of required coordinates and required `TileLayer` +* Fixed overly-aggressive Flutter-side tile image caching which prevented changes to `TileLayer.urlTemplate` from updating the displayed tiles + ## [10.1.0] - 2025/02/02 * Added support for flutter_map v8 diff --git a/example/pubspec.yaml b/example/pubspec.yaml index a65c655e..85079493 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -1,7 +1,7 @@ name: fmtc_demo description: The demo app for 'flutter_map_tile_caching', showcasing its functionality and use-cases. publish_to: "none" -version: 10.1.0 +version: 11.0.0 environment: sdk: ">=3.6.0 <4.0.0" diff --git a/lib/src/providers/image_provider/image_provider.dart b/lib/src/providers/image_provider/image_provider.dart index e696f407..b11f48dd 100644 --- a/lib/src/providers/image_provider/image_provider.dart +++ b/lib/src/providers/image_provider/image_provider.dart @@ -74,8 +74,8 @@ class _FMTCImageProvider extends ImageProvider<_FMTCImageProvider> { /// {@macro fmtc.tileProvider.provideTile} static Future provideTile({ - required String networkUrl, required FMTCTileProvider provider, + required String networkUrl, TileCoordinates? coords, Object? key, void Function()? startedLoading, diff --git a/pubspec.yaml b/pubspec.yaml index 8b7aaec8..aae94d9d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: flutter_map_tile_caching description: Plugin for 'flutter_map' providing advanced caching functionality, with ability to download map regions for offline use. -version: 10.1.0 +version: 11.0.0-dev.1 repository: https://github.com/JaffaKetchup/flutter_map_tile_caching issue_tracker: https://github.com/JaffaKetchup/flutter_map_tile_caching/issues diff --git a/windowsApplicationInstallerSetup.iss b/windowsApplicationInstallerSetup.iss index 53b7ccb7..a131ac3d 100644 --- a/windowsApplicationInstallerSetup.iss +++ b/windowsApplicationInstallerSetup.iss @@ -1,7 +1,7 @@ ; Script generated by the Inno Setup Script Wizard #define MyAppName "FMTC Demo" -#define MyAppVersion "for 10.1.0" +#define MyAppVersion "for 11.0.0" #define MyAppPublisher "JaffaKetchup Development" #define MyAppURL "https://github.com/JaffaKetchup/flutter_map_tile_caching" #define MyAppSupportURL "https://github.com/JaffaKetchup/flutter_map_tile_caching/issues" From 926485433e80d2d13735941caf630a186c992852 Mon Sep 17 00:00:00 2001 From: JaffaKetchup Date: Sun, 9 Mar 2025 18:31:55 +0000 Subject: [PATCH 5/5] Bump to v11 prerelease --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index bc6944be..05aa84dd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: flutter_map_tile_caching description: Plugin for 'flutter_map' providing advanced caching functionality, with ability to download map regions for offline use. -version: 11.0.0-dev.1 +version: 11.0.0-dev.2 repository: https://github.com/JaffaKetchup/flutter_map_tile_caching issue_tracker: https://github.com/JaffaKetchup/flutter_map_tile_caching/issues