Skip to content

Feature layer hit testing throws LateInitializationError in some cases #2051

Closed
@corepuncher

Description

@corepuncher

What is the bug?

Maybe FM 8.1.0 related?

I can reproduce easily by simply toggling off layers (removing things like polygons or lines widgets).

When this happens, the map no longer responds, and it just continually throws exceptions

I reverted back to 8.0.0, and the issue went away.

It appears that in some cases the code path for hit testing (for instance in _PolygonPainter.elementHitTest) is triggering the access of _viewportRect without ensuring it’s initialized.


════════ Exception caught by gestures library ═════════
The following LateError was thrown while handling a pointer data packet:
LateInitializationError: Field '_viewportRect@1639329998' has not been initialized.

When the exception was thrown, this was the stack:
#0      FeatureLayerUtils.viewportRect (package:flutter_map/src/layer/shared/feature_layer_utils.dart:16:28)
feature_layer_utils.dart:16
#1      FeatureLayerUtils.areOffsetsVisible (package:flutter_map/src/layer/shared/feature_layer_utils.dart:40:11)
feature_layer_utils.dart:40
#2      _PolygonPainter.elementHitTest.checkIfHit (package:flutter_map/src/layer/polygon_layer/painter.dart:75:12)
painter.dart:75
#3      FeatureLayerUtils.workAcrossWorlds (package:flutter_map/src/layer/shared/feature_layer_utils.dart:58:13)
feature_layer_utils.dart:58
#4      _PolygonPainter.elementHitTest (package:flutter_map/src/layer/polygon_layer/painter.dart:112:12)
painter.dart:112
#5      HitDetectablePainter.hitTest (package:flutter_map/src/layer/shared/layer_interactivity/internal_hit_detectable.dart:69:11)
internal_hit_detectable.dart:69
#6      RenderCustomPaint.hitTestSelf (package:flutter/src/rendering/custom_paint.dart:569:43)
custom_paint.dart:569
#7      RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:58)
box.dart:2943
#8      RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#9      RenderTransform.hitTestChildren.<anonymous closure> (package:flutter/src/rendering/proxy_box.dart:2560:22)
proxy_box.dart:2560
#10     BoxHitTestResult.addWithRawTransform (package:flutter/src/rendering/box.dart:876:31)
box.dart:876
#11     BoxHitTestResult.addWithPaintTransform (package:flutter/src/rendering/box.dart:810:12)
box.dart:810
#12     RenderTransform.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:2556:19)
proxy_box.dart:2556
#13     RenderTransform.hitTest (package:flutter/src/rendering/proxy_box.dart:2550:12)
proxy_box.dart:2550
#14     RenderShiftedBox.hitTestChildren.<anonymous closure> (package:flutter/src/rendering/shifted_box.dart:95:24)
shifted_box.dart:95
#15     BoxHitTestResult.addWithPaintOffset (package:flutter/src/rendering/box.dart:840:31)
box.dart:840
#16     RenderShiftedBox.hitTestChildren (package:flutter/src/rendering/shifted_box.dart:90:21)
shifted_box.dart:90
#17     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#18     RenderBoxContainerDefaultsMixin.defaultHitTestChildren.<anonymous closure> (package:flutter/src/rendering/box.dart:3339:25)
box.dart:3339
#19     BoxHitTestResult.addWithPaintOffset (package:flutter/src/rendering/box.dart:840:31)
box.dart:840
#20     RenderBoxContainerDefaultsMixin.defaultHitTestChildren (package:flutter/src/rendering/box.dart:3334:33)
box.dart:3334
#21     RenderStack.hitTestChildren (package:flutter/src/rendering/stack.dart:695:12)
stack.dart:695
#22     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#23     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#24     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#25     RenderBoxContainerDefaultsMixin.defaultHitTestChildren.<anonymous closure> (package:flutter/src/rendering/box.dart:3339:25)
box.dart:3339
#26     BoxHitTestResult.addWithPaintOffset (package:flutter/src/rendering/box.dart:840:31)
box.dart:840
#27     RenderBoxContainerDefaultsMixin.defaultHitTestChildren (package:flutter/src/rendering/box.dart:3334:33)
box.dart:3334
#28     RenderStack.hitTestChildren (package:flutter/src/rendering/stack.dart:695:12)
stack.dart:695
#29     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#30     RenderBoxContainerDefaultsMixin.defaultHitTestChildren.<anonymous closure> (package:flutter/src/rendering/box.dart:3339:25)
box.dart:3339
#31     BoxHitTestResult.addWithPaintOffset (package:flutter/src/rendering/box.dart:840:31)
box.dart:840
#32     RenderBoxContainerDefaultsMixin.defaultHitTestChildren (package:flutter/src/rendering/box.dart:3334:33)
box.dart:3334
#33     RenderStack.hitTestChildren (package:flutter/src/rendering/stack.dart:695:12)
stack.dart:695
#34     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#35     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#36     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#37     RenderClipRect.hitTest (package:flutter/src/rendering/proxy_box.dart:1568:18)
proxy_box.dart:1568
#38     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#39     RenderProxyBoxWithHitTestBehavior.hitTest (package:flutter/src/rendering/proxy_box.dart:183:19)
proxy_box.dart:183
#40     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#41     RenderProxyBoxWithHitTestBehavior.hitTest (package:flutter/src/rendering/proxy_box.dart:183:19)
proxy_box.dart:183
#42     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#43     RenderProxyBoxWithHitTestBehavior.hitTest (package:flutter/src/rendering/proxy_box.dart:183:19)
proxy_box.dart:183
#44     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#45     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#46     _RenderLayoutBuilder.hitTestChildren (package:flutter/src/widgets/layout_builder.dart:407:19)
layout_builder.dart:407
#47     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#48     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#49     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#50     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#51     RenderProxyBoxWithHitTestBehavior.hitTest (package:flutter/src/rendering/proxy_box.dart:183:19)
proxy_box.dart:183
#52     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#53     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#54     RenderBoxContainerDefaultsMixin.defaultHitTestChildren.<anonymous closure> (package:flutter/src/rendering/box.dart:3339:25)
box.dart:3339
#55     BoxHitTestResult.addWithPaintOffset (package:flutter/src/rendering/box.dart:840:31)
box.dart:840
#56     RenderBoxContainerDefaultsMixin.defaultHitTestChildren (package:flutter/src/rendering/box.dart:3334:33)
box.dart:3334
#57     RenderStack.hitTestChildren (package:flutter/src/rendering/stack.dart:695:12)
stack.dart:695
#58     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#59     RenderBoxContainerDefaultsMixin.defaultHitTestChildren.<anonymous closure> (package:flutter/src/rendering/box.dart:3339:25)
box.dart:3339
#60     BoxHitTestResult.addWithPaintOffset (package:flutter/src/rendering/box.dart:840:31)
box.dart:840
#61     RenderBoxContainerDefaultsMixin.defaultHitTestChildren (package:flutter/src/rendering/box.dart:3334:33)
box.dart:3334
#62     RenderCustomMultiChildLayoutBox.hitTestChildren (package:flutter/src/rendering/custom_layout.dart:429:12)
custom_layout.dart:429
#63     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#64     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#65     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#66     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#67     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#68     RenderPhysicalModel.hitTest (package:flutter/src/rendering/proxy_box.dart:2032:18)
proxy_box.dart:2032
#69     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#70     RenderProxyBoxWithHitTestBehavior.hitTest (package:flutter/src/rendering/proxy_box.dart:183:19)
proxy_box.dart:183
#71     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#72     RenderProxyBoxWithHitTestBehavior.hitTest (package:flutter/src/rendering/proxy_box.dart:183:19)
proxy_box.dart:183
#73     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#74     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#75     _RenderLayoutBuilder.hitTestChildren (package:flutter/src/widgets/layout_builder.dart:407:19)
layout_builder.dart:407
#76     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#77     RenderBoxContainerDefaultsMixin.defaultHitTestChildren.<anonymous closure> (package:flutter/src/rendering/box.dart:3339:25)
box.dart:3339
#78     BoxHitTestResult.addWithPaintOffset (package:flutter/src/rendering/box.dart:840:31)
box.dart:840
#79     RenderBoxContainerDefaultsMixin.defaultHitTestChildren (package:flutter/src/rendering/box.dart:3334:33)
box.dart:3334
#80     RenderStack.hitTestChildren (package:flutter/src/rendering/stack.dart:695:12)
stack.dart:695
#81     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#82     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#83     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#84     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#85     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#86     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#87     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#88     RenderIgnorePointer.hitTest (package:flutter/src/rendering/proxy_box.dart:3625:31)
proxy_box.dart:3625
#89     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#90     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#91     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#92     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#93     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#94     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#95     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#96     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#97     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#98     RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#99     RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#100    RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#101    RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#102    RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#103    RenderOffstage.hitTest (package:flutter/src/rendering/proxy_box.dart:3756:31)
proxy_box.dart:3756
#104    RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#105    RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#106    _RenderTheaterMixin.hitTestChildren.childHitTest (package:flutter/src/widgets/overlay.dart:1097:22)
overlay.dart:1097
#107    BoxHitTestResult.addWithPaintOffset (package:flutter/src/rendering/box.dart:840:31)
box.dart:840
#108    _RenderTheaterMixin.hitTestChildren (package:flutter/src/widgets/overlay.dart:1098:22)
overlay.dart:1098
#109    RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#110    RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#111    RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#112    RenderAbsorbPointer.hitTest (package:flutter/src/rendering/proxy_box.dart:3877:56)
proxy_box.dart:3877
#113    RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#114    RenderProxyBoxWithHitTestBehavior.hitTest (package:flutter/src/rendering/proxy_box.dart:183:19)
proxy_box.dart:183
#115    RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#116    RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#117    RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#118    RenderCustomPaint.hitTestChildren (package:flutter/src/rendering/custom_paint.dart:564:18)
custom_paint.dart:564
#119    RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#120    RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#121    RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#122    RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#123    RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#124    RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#125    RenderTapRegionSurface.hitTest (package:flutter/src/widgets/tap_region.dart:234:28)
tap_region.dart:234
#126    RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#127    RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#128    RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#129    RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#130    RenderProxyBoxMixin.hitTestChildren (package:flutter/src/rendering/proxy_box.dart:128:19)
proxy_box.dart:128
#131    RenderBox.hitTest (package:flutter/src/rendering/box.dart:2943:11)
box.dart:2943
#132    RenderView.hitTest (package:flutter/src/rendering/view.dart:311:12)
view.dart:311
#133    RendererBinding.hitTestInView (package:flutter/src/rendering/binding.dart:649:34)
binding.dart:649
#134    GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:408:7)
binding.dart:408
#135    GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:394:5)
binding.dart:394
#136    GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:341:7)
binding.dart:341
#137    GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:308:9)
binding.dart:308
#138    _invoke1 (dart:ui/hooks.dart:332:13)
hooks.dart:332
#139    PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:451:7)
platform_dispatcher.dart:451
#140    _dispatchPointerDataPacket (dart:ui/hooks.dart:267:31)
hooks.dart:267

How can we reproduce it?

For me, just toggling various polygon layers off causes the exceptions immediately.

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