Skip to content

Commit 4739cc9

Browse files
authored
feat: add built-in caching & tile loading cancellation support (#2082)
1 parent 6214a45 commit 4739cc9

40 files changed

+2442
-694
lines changed

example/lib/main.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter_map_example/pages/abort_obsolete_requests.dart';
23
import 'package:flutter_map_example/pages/animated_map_controller.dart';
34
import 'package:flutter_map_example/pages/bundled_offline_map.dart';
4-
import 'package:flutter_map_example/pages/cancellable_tile_provider.dart';
55
import 'package:flutter_map_example/pages/circle.dart';
66
import 'package:flutter_map_example/pages/debouncing_tile_update_transformer.dart';
77
import 'package:flutter_map_example/pages/epsg3996_crs.dart';
@@ -52,8 +52,8 @@ class MyApp extends StatelessWidget {
5252
),
5353
home: const HomePage(),
5454
routes: <String, WidgetBuilder>{
55-
CancellableTileProviderPage.route: (context) =>
56-
const CancellableTileProviderPage(),
55+
AbortObsoleteRequestsPage.route: (context) =>
56+
const AbortObsoleteRequestsPage(),
5757
PolylinePage.route: (context) => const PolylinePage(),
5858
SingleWorldPolysPage.route: (context) => const SingleWorldPolysPage(),
5959
PolylinePerfStressPage.route: (context) =>

example/lib/misc/tile_providers.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import 'package:flutter_map/flutter_map.dart';
2-
import 'package:flutter_map_cancellable_tile_provider/flutter_map_cancellable_tile_provider.dart';
2+
import 'package:http/http.dart';
3+
import 'package:http/retry.dart';
4+
5+
final httpClient = RetryClient(Client());
36

47
TileLayer get openStreetMapTileLayer => TileLayer(
58
urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
69
userAgentPackageName: 'dev.fleaflet.flutter_map.example',
7-
// Use the recommended flutter_map_cancellable_tile_provider package to
8-
// support the cancellation of loading tiles.
9-
tileProvider: CancellableNetworkTileProvider(),
10+
tileProvider: NetworkTileProvider(httpClient: httpClient),
1011
);
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter_map/flutter_map.dart';
3+
import 'package:flutter_map_example/widgets/drawer/menu_drawer.dart';
4+
import 'package:flutter_map_example/widgets/notice_banner.dart';
5+
import 'package:latlong2/latlong.dart';
6+
7+
class AbortObsoleteRequestsPage extends StatefulWidget {
8+
static const String route = '/abort_obsolete_requests_page';
9+
10+
const AbortObsoleteRequestsPage({super.key});
11+
12+
@override
13+
State<AbortObsoleteRequestsPage> createState() =>
14+
_AbortUnnecessaryRequestsPage();
15+
}
16+
17+
class _AbortUnnecessaryRequestsPage extends State<AbortObsoleteRequestsPage> {
18+
bool _abortingEnabled = true;
19+
20+
@override
21+
Widget build(BuildContext context) {
22+
return Scaffold(
23+
appBar: AppBar(title: const Text('Abort Obsolete Requests')),
24+
drawer: const MenuDrawer(AbortObsoleteRequestsPage.route),
25+
body: Column(
26+
children: [
27+
Padding(
28+
padding: const EdgeInsets.symmetric(horizontal: 8),
29+
child: Center(
30+
child: Switch.adaptive(
31+
value: _abortingEnabled,
32+
onChanged: (value) => setState(() => _abortingEnabled = value),
33+
),
34+
),
35+
),
36+
const NoticeBanner.recommendation(
37+
text: 'Since v8.2.0, in-flight HTTP requests for tiles which are '
38+
'no longer displayed are aborted by default.',
39+
url: 'https://docs.fleaflet.dev/layers/tile-layer/tile-providers',
40+
sizeTransition: 870,
41+
),
42+
Expanded(
43+
child: FlutterMap(
44+
options: MapOptions(
45+
initialCenter: const LatLng(51.5, -0.09),
46+
initialZoom: 5,
47+
cameraConstraint: CameraConstraint.contain(
48+
bounds: LatLngBounds(
49+
const LatLng(-90, -180),
50+
const LatLng(90, 180),
51+
),
52+
),
53+
),
54+
children: [
55+
TileLayer(
56+
key: ValueKey(_abortingEnabled),
57+
urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
58+
userAgentPackageName: 'dev.fleaflet.flutter_map.example',
59+
tileProvider: NetworkTileProvider(
60+
abortObsoleteRequests: _abortingEnabled,
61+
),
62+
),
63+
],
64+
),
65+
),
66+
],
67+
),
68+
);
69+
}
70+
}

example/lib/pages/animated_map_controller.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_map/flutter_map.dart';
3-
import 'package:flutter_map_cancellable_tile_provider/flutter_map_cancellable_tile_provider.dart';
43
import 'package:flutter_map_example/widgets/drawer/menu_drawer.dart';
54
import 'package:latlong2/latlong.dart';
65

@@ -182,7 +181,6 @@ class AnimatedMapControllerPageState extends State<AnimatedMapControllerPage>
182181
urlTemplate:
183182
'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
184183
userAgentPackageName: 'dev.fleaflet.flutter_map.example',
185-
tileProvider: CancellableNetworkTileProvider(),
186184
tileUpdateTransformer: _animatedMoveTileUpdateTransformer,
187185
),
188186
const MarkerLayer(markers: _markers),

example/lib/pages/cancellable_tile_provider.dart

Lines changed: 0 additions & 74 deletions
This file was deleted.

example/lib/pages/fallback_url_page.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_map/flutter_map.dart';
3-
import 'package:flutter_map_cancellable_tile_provider/flutter_map_cancellable_tile_provider.dart';
43
import 'package:flutter_map_example/widgets/drawer/menu_drawer.dart';
54
import 'package:flutter_map_example/widgets/notice_banner.dart';
65
import 'package:latlong2/latlong.dart';
@@ -44,7 +43,6 @@ class FallbackUrlPage extends StatelessWidget {
4443
'https://not-a-real-provider-url.local/{z}/{x}/{y}.png',
4544
fallbackUrl: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
4645
userAgentPackageName: 'dev.fleaflet.flutter_map.example',
47-
tileProvider: CancellableNetworkTileProvider(),
4846
),
4947
],
5048
),

example/lib/pages/reset_tile_layer.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import 'dart:async';
22

33
import 'package:flutter/material.dart';
44
import 'package:flutter_map/flutter_map.dart';
5-
import 'package:flutter_map_cancellable_tile_provider/flutter_map_cancellable_tile_provider.dart';
65
import 'package:flutter_map_example/widgets/drawer/menu_drawer.dart';
76
import 'package:latlong2/latlong.dart';
87

@@ -63,7 +62,6 @@ class ResetTileLayerPageState extends State<ResetTileLayerPage> {
6362
urlTemplate: layerToggle ? layer1 : layer2,
6463
subdomains: layerToggle ? const [] : const ['a', 'b', 'c'],
6564
userAgentPackageName: 'dev.fleaflet.flutter_map.example',
66-
tileProvider: CancellableNetworkTileProvider(),
6765
),
6866
const MarkerLayer(
6967
markers: [

example/lib/pages/tile_builder.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_map/flutter_map.dart';
3-
import 'package:flutter_map_cancellable_tile_provider/flutter_map_cancellable_tile_provider.dart';
43
import 'package:flutter_map_example/widgets/drawer/menu_drawer.dart';
54
import 'package:latlong2/latlong.dart';
65

@@ -120,7 +119,6 @@ class TileBuilderPageState extends State<TileBuilderPage> {
120119
urlTemplate:
121120
'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
122121
userAgentPackageName: 'dev.fleaflet.flutter_map.example',
123-
tileProvider: CancellableNetworkTileProvider(),
124122
tileBuilder: tileBuilder,
125123
),
126124
),

example/lib/pages/tile_loading_error_handle.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_map/flutter_map.dart';
3-
import 'package:flutter_map_cancellable_tile_provider/flutter_map_cancellable_tile_provider.dart';
43
import 'package:flutter_map_example/widgets/drawer/menu_drawer.dart';
54
import 'package:latlong2/latlong.dart';
65

@@ -67,7 +66,7 @@ class TileLoadingErrorHandleState extends State<TileLoadingErrorHandle> {
6766
// or use the recommended tile provider
6867
tileProvider: _simulateTileLoadErrors
6968
? _SimulateErrorsTileProvider()
70-
: CancellableNetworkTileProvider(),
69+
: NetworkTileProvider(),
7170
),
7271
],
7372
);

example/lib/widgets/drawer/menu_drawer.dart

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import 'package:flutter/foundation.dart';
22
import 'package:flutter/material.dart';
3+
import 'package:flutter_map_example/pages/abort_obsolete_requests.dart';
34
import 'package:flutter_map_example/pages/animated_map_controller.dart';
45
import 'package:flutter_map_example/pages/bundled_offline_map.dart';
5-
import 'package:flutter_map_example/pages/cancellable_tile_provider.dart';
66
import 'package:flutter_map_example/pages/circle.dart';
77
import 'package:flutter_map_example/pages/debouncing_tile_update_transformer.dart';
88
import 'package:flutter_map_example/pages/epsg3996_crs.dart';
@@ -47,7 +47,13 @@ class MenuDrawer extends StatelessWidget {
4747
return Drawer(
4848
child: ListView(
4949
children: <Widget>[
50-
DrawerHeader(
50+
Container(
51+
padding: const EdgeInsets.fromLTRB(16, 32, 16, 16)
52+
.add(EdgeInsets.only(top: MediaQuery.paddingOf(context).top)),
53+
margin: const EdgeInsets.only(bottom: 8),
54+
decoration: BoxDecoration(
55+
border: Border(bottom: Divider.createBorderSide(context)),
56+
),
5157
child: Column(
5258
mainAxisAlignment: MainAxisAlignment.center,
5359
children: [
@@ -65,11 +71,12 @@ class MenuDrawer extends StatelessWidget {
6571
textAlign: TextAlign.center,
6672
style: TextStyle(fontSize: 14),
6773
),
74+
const SizedBox(height: 8),
6875
if (kIsWeb)
69-
const Text(
76+
Text(
7077
_isWASM ? 'Running with WASM' : 'Running without WASM',
7178
textAlign: TextAlign.center,
72-
style: TextStyle(fontSize: 14),
79+
style: Theme.of(context).textTheme.bodySmall,
7380
),
7481
],
7582
),
@@ -155,8 +162,8 @@ class MenuDrawer extends StatelessWidget {
155162
currentRoute: currentRoute,
156163
),
157164
MenuItemWidget(
158-
caption: 'Cancellable Tile Provider',
159-
routeName: CancellableTileProviderPage.route,
165+
caption: 'Abort Obsolete Requests',
166+
routeName: AbortObsoleteRequestsPage.route,
160167
currentRoute: currentRoute,
161168
),
162169
MenuItemWidget(

0 commit comments

Comments
 (0)