A slim yet powerful caching plugin for flutter_map tile layers.
The package is using dio with the dio_cache_interceptor package and supports the storage backend that you like.
Supported storage backends are:
- In-Memory (for testing)
- File System
- Drift (SQLite)
- Hive
- ObjectBox
Support for Isar and other storage backends will be supported as soon as the underlying package dio_cache_interceptor support them. See for example issue dio_cache_interceptor#122 that tracks the support for isar.
- Add the packages you want to use to your
pubspec.yaml
file. Only add the packages for the backend you want to use.
dependencies:
flutter_map: ^6.0.0 # in case you don't have it yet
flutter_map_cache: ^1.3.0 # this package
dio_cache_interceptor_db_store: ^5.1.0 # drift
sqlite3_flutter_libs: ^0.5.15 # drift
dio_cache_interceptor_file_store: ^1.2.2 # file system
dio_cache_interceptor_hive_store: ^3.2.1 # hive
dio_cache_interceptor_objectbox_store: ^1.1.1 # objectbox
objectbox_flutter_libs: ^1.4.1 # objectbox
- The storage backends might have their own required setups. Please check them out in their package documentations.
Using the cache is easy. Here is an example how to use the Hive backend:
First get the cache directory of the app (i.e. with the path_provider package).
import 'package:path_provider/path_provider.dart';
Future<String> getPath() async {
final cacheDirectory = await getTemporaryDirectory();
return cacheDirectory.path;
}
Then use the directory path to initialize the HiveCacheStore
. You can wrap FlutterMap inside a FutureBuilder
to use
the getPath() method.
@override
Widget build(BuildContext context) {
return FlutterMap(
options: MapOptions(),
children: [
TileLayer(
urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
tileProvider: CachedTileProvider(
// maxStale keeps the tile cached for the given Duration and
// tries to revalidate the next time it gets requested
maxStale: const Duration(days: 30),
store: HiveCacheStore(
path,
hiveBoxName: 'HiveCacheStore',
),
),
),
],
);
}
You can find additional example usages for other storage backends here:
This package supports the web as long as you use a storage backend that supports web.
- In Memory works out of the box
- Hive uses for its web support IndexedDB under the hood to support web.
- Drift (SqLite) requires additional setup steps for web
Additionally, this package has support to cancel tile requests that are no longer needed like the flutter_map_cancellable_tile_provider plugin.
Commercial tile providers often use an api key that is attached as a parameter to the url. While this shouldn't be a problem when the api key stays the same you might want to make it immune to api key changes anyway.
final _uuid = Uuid();
CachedTileProvider(
keyBuilder: (request) {
return _uuid.v5(
Uuid.NAMESPACE_URL,
request.uri.replace(queryParameters: {}).toString(),
);
},
...
),
Pull requests are welcome. If you want to add support for another storage backend you can check out dio_cache_interceptor.
If you need help you can open an issue or join the flutter_map discord server.