diff --git a/example/lib/main.dart b/example/lib/main.dart index 969ef5af1..a515c639f 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -30,6 +30,7 @@ import 'package:flutter_map_example/pages/secondary_tap.dart'; import 'package:flutter_map_example/pages/single_world_polys.dart'; import 'package:flutter_map_example/pages/sliding_map.dart'; import 'package:flutter_map_example/pages/tile_builder.dart'; +import 'package:flutter_map_example/pages/tile_error.dart'; import 'package:flutter_map_example/pages/tile_loading_error_handle.dart'; import 'package:flutter_map_example/pages/wms_tile_layer.dart'; import 'package:flutter_web_plugins/url_strategy.dart'; @@ -55,6 +56,7 @@ class MyApp extends StatelessWidget { AbortObsoleteRequestsPage.route: (context) => const AbortObsoleteRequestsPage(), PolylinePage.route: (context) => const PolylinePage(), + TileErrorPage.route: (context) => const TileErrorPage(), SingleWorldPolysPage.route: (context) => const SingleWorldPolysPage(), PolylinePerfStressPage.route: (context) => const PolylinePerfStressPage(), diff --git a/example/lib/pages/tile_error.dart b/example/lib/pages/tile_error.dart new file mode 100644 index 000000000..02477449a --- /dev/null +++ b/example/lib/pages/tile_error.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:flutter_map_example/widgets/drawer/menu_drawer.dart'; + +/// Example of tile loading systematically failing. +class TileErrorPage extends StatelessWidget { + static const String route = '/tile_error'; + + const TileErrorPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Tile Error')), + drawer: const MenuDrawer(TileErrorPage.route), + body: FlutterMap( + options: const MapOptions( + initialZoom: 3, + ), + children: [ + TileLayer( + // obviously wrong url template + urlTemplate: 'https://example.com/{z}/{y}/{x}', + tileBuilder: (context, tileWidget, tile) { + if (tile.loadError) { + return Center( + child: Text('${tile.coordinates.z}' + '/' + '${tile.coordinates.x}' + '/' + '${tile.coordinates.y}'), + ); + } + return tileWidget; + }, + ), + ], + ), + ); + } +} diff --git a/example/lib/widgets/drawer/menu_drawer.dart b/example/lib/widgets/drawer/menu_drawer.dart index 4107eec51..4544b5d1c 100644 --- a/example/lib/widgets/drawer/menu_drawer.dart +++ b/example/lib/widgets/drawer/menu_drawer.dart @@ -34,6 +34,7 @@ import 'package:flutter_map_example/pages/secondary_tap.dart'; import 'package:flutter_map_example/pages/single_world_polys.dart'; import 'package:flutter_map_example/pages/sliding_map.dart'; import 'package:flutter_map_example/pages/tile_builder.dart'; +import 'package:flutter_map_example/pages/tile_error.dart'; import 'package:flutter_map_example/pages/tile_loading_error_handle.dart'; import 'package:flutter_map_example/pages/wms_tile_layer.dart'; import 'package:flutter_map_example/widgets/drawer/menu_item.dart'; @@ -162,6 +163,11 @@ class MenuDrawer extends StatelessWidget { routeName: ScaleBarPage.route, currentRoute: currentRoute, ), + MenuItemWidget( + caption: 'Tile error', + routeName: TileErrorPage.route, + currentRoute: currentRoute, + ), const Divider(), MenuItemWidget( caption: 'Repeated Worlds/Longitudes', diff --git a/lib/src/layer/tile_layer/tile_image.dart b/lib/src/layer/tile_layer/tile_image.dart index 882384931..71fe06a54 100644 --- a/lib/src/layer/tile_layer/tile_image.dart +++ b/lib/src/layer/tile_layer/tile_image.dart @@ -170,7 +170,7 @@ class TileImage extends ChangeNotifier { loadError = true; if (!_disposed) { - if (errorImage != null) _display(); + _display(); onLoadError(this, exception, stackTrace); onLoadComplete(coordinates); } @@ -184,11 +184,6 @@ class TileImage extends ChangeNotifier { loadFinishedAt = DateTime.now(); if (loadError) { - assert( - errorImage != null, - 'A TileImage should not be displayed if loading errors and there is no ' - 'errorImage to show.', - ); _readyToDisplay = true; if (!_disposed) notifyListeners(); return;