From 28f4916cf095415eb9c4abeedc0c2bc847fd1b55 Mon Sep 17 00:00:00 2001 From: Edoardo Balducci Date: Tue, 6 May 2025 16:52:47 +0200 Subject: [PATCH] feat(): added headers support in TileLayer Added support for sending headers when fetching image tiles --- src/flet_map/tile_layer.py | 12 ++++++++++++ src/flutter/flet_map/lib/src/map.dart | 3 +++ src/flutter/flet_map/lib/src/tile_layer.dart | 19 ++++++++++++++++++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/flet_map/tile_layer.py b/src/flet_map/tile_layer.py index fde6456..6819355 100644 --- a/src/flet_map/tile_layer.py +++ b/src/flet_map/tile_layer.py @@ -44,6 +44,7 @@ def __init__( max_zoom: OptionalNumber = None, min_zoom: OptionalNumber = None, error_image_src: Optional[str] = None, + headers: Optional[Dict[str, str]] = None, evict_error_tile_strategy: Optional[MapTileLayerEvictErrorTileStrategy] = None, on_image_error: OptionalControlEventCallable = None, # @@ -77,6 +78,7 @@ def __init__( self.error_image_src = error_image_src self.enable_retina_mode = enable_retina_mode self.on_image_error = on_image_error + self.headers = headers self.tile_bounds = tile_bounds self.evict_error_tile_strategy = evict_error_tile_strategy self.subdomains = subdomains @@ -94,6 +96,8 @@ def before_update(self): self._set_attr_json("subdomains", self.__subdomains) if isinstance(self.__additional_options, dict): self._set_attr_json("additionalOptions", self.__additional_options) + if isinstance(self.__headers, dict): + self._set_attr_json("headers", self.__headers) # url_template @property @@ -131,6 +135,14 @@ def additional_options(self) -> Optional[Dict[str, str]]: def additional_options(self, value: Optional[Dict[str, str]]): self.__additional_options = value + @property + def headers(self) -> Optional[Dict[str, str]]: + return self.__headers + + @headers.setter + def headers(self, value: Optional[Dict[str, str]]): + self.__headers = value + # tile_bounds @property def tile_bounds(self) -> Optional[MapLatitudeLongitudeBounds]: diff --git a/src/flutter/flet_map/lib/src/map.dart b/src/flutter/flet_map/lib/src/map.dart index d4f5911..1a960b0 100644 --- a/src/flutter/flet_map/lib/src/map.dart +++ b/src/flutter/flet_map/lib/src/map.dart @@ -94,6 +94,7 @@ class _MapControlState extends State curve: parseCurve(args["curve"], defaultAnimationCurve), duration: durationFromString( args["duration"], defaultAnimationDuration)); + case "zoom_to": var zoom = parseDouble(args["zoom"]); if (zoom != null) { @@ -102,6 +103,7 @@ class _MapControlState extends State duration: durationFromString( args["duration"], defaultAnimationDuration)); } + case "move_to": var zoom = parseDouble(args["zoom"]); var lat = parseDouble(args["lat"]); @@ -117,6 +119,7 @@ class _MapControlState extends State dest: (lat != null && long != null) ? LatLng(lat, long) : null, offset: (ox != null && oy != null) ? Offset(ox, oy) : Offset.zero, ); + case "center_on": var zoom = parseDouble(args["zoom"]); var lat = parseDouble(args["lat"]); diff --git a/src/flutter/flet_map/lib/src/tile_layer.dart b/src/flutter/flet_map/lib/src/tile_layer.dart index 918596c..7407724 100644 --- a/src/flutter/flet_map/lib/src/tile_layer.dart +++ b/src/flutter/flet_map/lib/src/tile_layer.dart @@ -40,15 +40,32 @@ class TileLayerControl extends StatelessWidget with FletStoreMixin { errorImage = NetworkImage(assetSrc.path); } } + var subdomains = control.attrString("subdomains"); var additionalOptions = control.attrString("additionalOptions"); + var headersStr = control.attrString("headers"); + + Map headers = {}; + if (headersStr != null) { + try { + final decodedHeaders = jsonDecode(headersStr) as Map; + headers = decodedHeaders.map((k, v) => MapEntry(k.toString(), v.toString())); + debugPrint("TileLayerControl headers: $headers"); + } catch (e) { + debugPrint("Error parsing headers: $e"); + } + } + + Widget tile = TileLayer( urlTemplate: control.attrString("urlTemplate", "")!, fallbackUrl: control.attrString("fallbackUrl", "")!, subdomains: subdomains != null ? jsonDecode(subdomains).cast() : ['a', 'b', 'c'], - tileProvider: CancellableNetworkTileProvider(), + tileProvider: CancellableNetworkTileProvider( + headers: headers, + ), tileDisplay: const TileDisplay.fadeIn(), tileSize: control.attrDouble("tileSize", 256)!, minNativeZoom: control.attrInt("minNativeZoom", 0)!,