Skip to content

Negative zoomOffset in TileLayer causes crash #2127

@ChibangLW

Description

@ChibangLW

What is the bug?

Great work on the library, thank you. Having a negative zoomOffset for a TileLayer crashes flutter_map in v8.2.0 and v8.2.1. It used to work with the previous version although an other caching setup.

ArgumentError: Invalid argument(s): -1
  #0      int._shlFromInteger (dart:core-patch/integers.dart:86:42)
  #1      int.<< (dart:core-patch/integers.dart:117:49)
  #2      TileCoordinatesResolver.get (package:flutter_map/src/layer/tile_layer/tile_coordinates.dart:83:22)
  #3      TileImageView._retainAncestor (package:flutter_map/src/layer/tile_layer/tile_image_view.dart:146:40)
  #4      TileImageView._retainAncestor (package:flutter_map/src/layer/tile_layer/tile_image_view.dart:157:14)
  #5      TileImageView.staleTiles (package:flutter_map/src/layer/tile_layer/tile_image_view.dart:73:32)
  #6      TileImageManager._prune (package:flutter_map/src/layer/tile_layer/tile_image_manager.dart:244:48)
  #7      TileImageManager.evictAndPrune (package:flutter_map/src/layer/tile_layer/tile_image_manager.dart:201:5)
  #8      _TileLayerState._loadAndPruneInVisibleBounds (package:flutter_map/src/layer/tile_layer/tile_layer.dart:690:23)
  #9      _TileLayerState.didChangeDependencies (package:flutter_map/src/layer/tile_layer/tile_layer.dart:459:22)
  #10      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:5860:11)
  #11      ComponentElement.mount (package:flutter/src/widgets/framework.dart:5691:5)
  #12      Element.inflateWidget (package:flutter/src/widgets/framework.dart:4539:16)
  #13      MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:7159:36)
  #14      MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7175:32)
  #15      Element.inflateWidget (package:flutter/src/widgets/framework.dart:4539:16)
  #16      Element.updateChild (package:flutter/src/widgets/framework.dart:4004:18)
  #17      SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:7008:14)
  #18      Element.inflateWidget (package:flutter/src/widgets/framework.dart:4539:16)
  #19      Element.updateChild (package:flutter/src/widgets/framework.dart:3998:20)
  #20      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5738:16)
  #21      Element.rebuild (package:flutter/src/widgets/framework.dart:5427:7)
  #22      ProxyElement.update (package:flutter/src/widgets/framework.dart:6041:5)
  #23      Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
  #24      SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7015:14)
  #25      Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
  #26      SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7015:14)
  #27      Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
  #28      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5738:16)
  #29      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5874:11)
  #30      Element.rebuild (package:flutter/src/widgets/framework.dart:5427:7)
  #31      StatefulElement.update (package:flutter/src/widgets/framework.dart:5899:5)
  #32      Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
  #33      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5738:16)
  #34      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5874:11)
  #35      Element.rebuild (package:flutter/src/widgets/framework.dart:5427:7)
  #36      StatefulElement.update (package:flutter/src/widgets/framework.dart:5899:5)
  #37      Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
  #38      SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7015:14)
  #39      Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
  #40      SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:7015:14)
  #41      Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
  #42      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5738:16)
  #43      Element.rebuild (package:flutter/src/widgets/framework.dart:5427:7)
  #44      ProxyElement.update (package:flutter/src/widgets/framework.dart:6041:5)
  #45      _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:108:11)
  #46      Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
  #47      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5738:16)
  #48      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5874:11)
  #49      Element.rebuild (package:flutter/src/widgets/framework.dart:5427:7)
  #50      StatefulElement.update (package:flutter/src/widgets/framework.dart:5899:5)
  #51      Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
  #52      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5738:16)
  #53      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5874:11)
  #54      Element.rebuild (package:flutter/src/widgets/framework.dart:5427:7)
  #55      StatefulElement.update (package:flutter/src/widgets/framework.dart:5899:5)
  #56      Element.updateChild (package:flutter/src/widgets/framework.dart:3982:15)
  #57      _LayoutBuilderElement._rebuildWithConstraints.updateChildCallback (package:flutter/src/widgets/layout_builder.dart:249:18)
  #58      BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:3046:19)
  #59      _LayoutBuilderElement._rebuildWithConstraints (package:flutter/src/widgets/layout_builder.dart:272:12)
  #60      RenderAbstractLayoutBuilderMixin.layoutCallback (package:flutter/src/widgets/layout_builder.dart:335:38)
  #61      RenderObjectWithLayoutCallbackMixin.runLayoutCallback.<fn> (package:flutter/src/rendering/object.dart:4209:33)
  #62      RenderObject.invokeLayoutCallback.<fn> (package:flutter/src/rendering/object.dart:2941:17)
  #63      PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:1209:15)
  #64      RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:2940:14)
  #65      RenderObjectWithLayoutCallbackMixin.runLayoutCallback (package:flutter/src/rendering/object.dart:4209:5)
  #66      _RenderLayoutBuilder.performLayout (package:flutter/src/widgets/layout_builder.dart:449:5)
  #67      RenderObject.layout (package:flutter/src/rendering/object.dart:2822:7)
  #68      RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:115:18)
  #69      RenderObject.layout (package:flutter/src/rendering/object.dart:2822:7)
  #70      ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:62:11)
  #71      RenderStack._computeSize (package:flutter/src/rendering/stack.dart:646:43)
  #72      RenderStack.performLayout (package:flutter/src/rendering/stack.dart:673:12)
  #73      RenderObject.layout (package:flutter/src/rendering/object.dart:2822:7)
  #74      ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:62:11)
  #75      RenderFlex._computeSizes (package:flutter/src/rendering/flex.dart:1202:26)
  #76      RenderFlex.performLayout (package:flutter/src/rendering/flex.dart:1255:32)
  #77      RenderObject.layout (package:flutter/src/rendering/object.dart:2822:7)
  #78      RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:243:12)
  #79      RenderObject.layout (package:flutter/src/rendering/object.dart:2822:7)
  #80      MultiChildLayoutDelegate.layoutChild (package:flutter/src/rendering/custom_layout.dart:180:12)
  #81      _ScaffoldLayout.performLayout (package:flutter/src/material/scaffold.dart:1118:7)
  #82      MultiChildLayoutDelegate._callPerformLayout (package:flutter/src/rendering/custom_layout.dart:249:7)
  #83      RenderCustomMultiChildLayoutBox.performLayout (package:flutter/src/rendering/custom_layout.dart:419:14)
  #84      RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:2655:7)
  #85      PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:1160:18)
  #86      PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:1173:15)
  #87      RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:629:23)
  #88      WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:1242:13)
  #89      RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:495:5)
  #90      SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1438:15)
  #91      SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1351:9)
  #92      SentryWidgetsBindingMixin.handleDrawFrame (package:sentry_flutter/src/binding_wrapper.dart:128:11)
  #93      SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:1204:5)
  #94      _invoke (dart:ui/hooks.dart:331:13)
  #95      PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:444:5)
  #96      _drawFrame (dart:ui/hooks.dart:303:31)

How can we reproduce it?

Causes flutter_map to crash:

TileLayer(
      zoomOffset: -5
      minNativeZoom: 5,
      maxNativeZoom: 18,
      urlTemplate: 'https://sgx.geodatenzentrum.de/wmts_basemapde/tile/1.0.0/de_basemapde_web_raster_grau/default/DE_EPSG_3857_ADV/{z}/{y}/{x}.png',
      tileProvider: NetworkTileProvider(
        cachingProvider:
            BuiltInMapCachingProvider.getOrCreateInstance(),
      ),
    )

Tile Documentation

Works correct:

TileLayer(
      minNativeZoom: 5,
      maxNativeZoom: 18,
      urlTemplate: 'https://sgx.geodatenzentrum.de/wmts_basemapde/tile/1.0.0/de_basemapde_web_raster_grau/default/GLOBAL_WEBMERCATOR/{z}/{y}/{x}.png',
      tileProvider: NetworkTileProvider(
        cachingProvider:
            BuiltInMapCachingProvider.getOrCreateInstance(),
      ),
    )

Do you have a potential solution?

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions