diff --git a/example/lib/main.dart b/example/lib/main.dart index 969ef5af1..d468e0d90 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'; @@ -76,6 +77,7 @@ class MyApp extends StatelessWidget { TileLoadingErrorHandle.route: (context) => const TileLoadingErrorHandle(), TileBuilderPage.route: (context) => const TileBuilderPage(), + ErrorTileBuilder.route: (context) => const ErrorTileBuilder(), InteractiveFlagsPage.route: (context) => const InteractiveFlagsPage(), ManyMarkersPage.route: (context) => const ManyMarkersPage(), MapInsideListViewPage.route: (context) => const MapInsideListViewPage(), diff --git a/example/lib/pages/tile_error.dart b/example/lib/pages/tile_error.dart new file mode 100644 index 000000000..dcd791ae2 --- /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 ErrorTileBuilder extends StatelessWidget { + static const String route = '/error_tile_builder'; + + const ErrorTileBuilder({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Error Tile Builder')), + drawer: const MenuDrawer(ErrorTileBuilder.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..cb55795a0 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'; @@ -280,6 +281,11 @@ class MenuDrawer extends StatelessWidget { routeName: TileBuilderPage.route, currentRoute: currentRoute, ), + MenuItemWidget( + caption: 'Custom Error Tile Builder', + routeName: ErrorTileBuilder.route, + currentRoute: currentRoute, + ), MenuItemWidget( caption: 'Retina Tile Layer', routeName: RetinaPage.route, 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;