Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Regression: FlutterError (setState() or markNeedsBuild() called during build. #1980

Closed
knopp opened this issue Apr 30, 2024 · 2 comments · Fixed by #1981
Closed

Regression: FlutterError (setState() or markNeedsBuild() called during build. #1980

knopp opened this issue Apr 30, 2024 · 2 comments · Fixed by #1981
Assignees
Labels
area_supertextfield Pertains to SuperTextField bounty_junior f:superlist Funded by Superlist time: 1 1hr or less

Comments

@knopp
Copy link
Contributor

knopp commented Apr 30, 2024

Relevant call stack:

The FocusNode sending notification was:
  FocusNode#0b014(_UrlFieldEditing-TextField)
════════════════════════════════════════════════════════════════════════════════════════════════════
══╡ EXCEPTION CAUGHT BY FOUNDATION LIBRARY ╞════════════════════════════════════════════════════════
The following assertion was thrown while dispatching notifications for FocusNode:
setState() or markNeedsBuild() called during build.
This SuperAndroidTextField widget cannot be marked as needing to build because the framework is
already in the process of building widgets. A widget can be marked as needing to be built during the
build phase only if one of its ancestors is currently building. This exception is allowed because
the framework builds parent widgets before children, which means a dirty descendant will always be
built. Otherwise, the framework might not visit this widget during this build phase.
The widget on which setState() or markNeedsBuild() was called was:
  SuperAndroidTextField-[GlobalKey#ffe20]
The widget which was currently being built when the offending call was made was:
  OverlayPortal

When the exception was thrown, this was the stack:
#0      Element.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:5041:9)
#1      Element.markNeedsBuild (package:flutter/src/widgets/framework.dart:5053:6)
#2      State.setState (package:flutter/src/widgets/framework.dart:1223:15)
#3      SuperAndroidTextFieldState._updateSelectionAndImeConnectionOnFocusChange (package:super_editor/src/super_textfield/android/android_textfield.dart:408:7)
#4      ChangeNotifier.notifyListeners (package:flutter/src/foundation/change_notifier.dart:433:24)
#5      FocusNode._notify (package:flutter/src/widgets/focus_manager.dart:1090:5)
#6      FocusNode._markNextFocus (package:flutter/src/widgets/focus_manager.dart:969:14)
#7      FocusNode._doRequestFocus (package:flutter/src/widgets/focus_manager.dart:1143:5)
#8      FocusNode._reparent (package:flutter/src/widgets/focus_manager.dart:1039:13)
#9      FocusAttachment.reparent (package:flutter/src/widgets/focus_manager.dart:255:14)
#10     _FocusState.didChangeDependencies (package:flutter/src/widgets/focus_scope.dart:575:23)
#11     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:5630:11)
#12     ComponentElement.mount (package:flutter/src/widgets/framework.dart:5457:5)
...     Normal element mounting (4 frames)
#16     Element.inflateWidget (package:flutter/src/widgets/framework.dart:4334:16)
#17     Element.updateChild (package:flutter/src/widgets/framework.dart:3843:18)
#18     _OverlayPortalElement.mount (package:flutter/src/widgets/overlay.dart:2061:14)
...     Normal element mounting (81 frames)
#99     Element.inflateWidget (package:flutter/src/widgets/framework.dart:4334:16)
#100    MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:6898:36)
#101    MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6910:32)
...     Normal element mounting (38 frames)
#139    Element.inflateWidget (package:flutter/src/widgets/framework.dart:4334:16)
#140    MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:6898:36)
#141    MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6910:32)
...     Normal element mounting (10 frames)
#151    Element.inflateWidget (package:flutter/src/widgets/framework.dart:4334:16)
#152    _TableElement.mount.<anonymous closure>.<anonymous closure> (package:flutter/src/widgets/table.dart:284:18)
#153    MappedListIterable.elementAt (dart:_internal/iterable.dart:425:31)
#154    ListIterator.moveNext (dart:_internal/iterable.dart:354:26)
#155    new _List._ofEfficientLengthIterable (dart:core-patch/array.dart:163:27)
#156    new _List.of (dart:core-patch/array.dart:128:20)
#157    new List.of (dart:core-patch/array_patch.dart:39:50)
#158    ListIterable.toList (dart:_internal/iterable.dart:224:7)
#159    _TableElement.mount.<anonymous closure> (package:flutter/src/widgets/table.dart:285:12)
#160    MappedListIterable.elementAt (dart:_internal/iterable.dart:425:31)
#161    ListIterator.moveNext (dart:_internal/iterable.dart:354:26)
#162    new _List._ofEfficientLengthIterable (dart:core-patch/array.dart:163:27)
#163    new _List.of (dart:core-patch/array.dart:128:20)
#164    new List.of (dart:core-patch/array_patch.dart:39:50)
#165    ListIterable.toList (dart:_internal/iterable.dart:224:7)
#166    _TableElement.mount (package:flutter/src/widgets/table.dart:287:8)
...     Normal element mounting (316 frames)
#482    Element.inflateWidget (package:flutter/src/widgets/framework.dart:4334:16)
#483    MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:6898:36)
#484    MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6910:32)
...     Normal element mounting (160 frames)
#644    Element.inflateWidget (package:flutter/src/widgets/framework.dart:4334:16)
#645    Element.updateChild (package:flutter/src/widgets/framework.dart:3837:20)
#646    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5506:16)
#647    Element.rebuild (package:flutter/src/widgets/framework.dart:5197:7)
#648    ProxyElement.update (package:flutter/src/widgets/framework.dart:5810:5)
#649    Element.updateChild (package:flutter/src/widgets/framework.dart:3821:15)
#650    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5506:16)
#651    StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5644:11)
#652    Element.rebuild (package:flutter/src/widgets/framework.dart:5197:7)
#653    StatefulElement.update (package:flutter/src/widgets/framework.dart:5667:5)
#654    Element.updateChild (package:flutter/src/widgets/framework.dart:3821:15)
#655    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5506:16)
#656    Element.rebuild (package:flutter/src/widgets/framework.dart:5197:7)
#657    ProxyElement.update (package:flutter/src/widgets/framework.dart:5810:5)
#658    Element.updateChild (package:flutter/src/widgets/framework.dart:3821:15)
#659    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5506:16)
#660    Element.rebuild (package:flutter/src/widgets/framework.dart:5197:7)
#661    ProxyElement.update (package:flutter/src/widgets/framework.dart:5810:5)
#662    Element.updateChild (package:flutter/src/widgets/framework.dart:3821:15)
#663    _RawViewElement._updateChild (package:flutter/src/widgets/view.dart:291:16)
#664    _RawViewElement.update (package:flutter/src/widgets/view.dart:378:5)
#665    Element.updateChild (package:flutter/src/widgets/framework.dart:3821:15)
#666    ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5506:16)
#667    Element.rebuild (package:flutter/src/widgets/framework.dart:5197:7)
#668    StatelessElement.update (package:flutter/src/widgets/framework.dart:5557:5)
#669    Element.updateChild (package:flutter/src/widgets/framework.dart:3821:15)
#670    RootElement._rebuild (package:flutter/src/widgets/binding.dart:1579:16)
#671    RootElement.update (package:flutter/src/widgets/binding.dart:1557:5)
#672    RootElement.performRebuild (package:flutter/src/widgets/binding.dart:1571:7)
#673    Element.rebuild (package:flutter/src/widgets/framework.dart:5197:7)
#674    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2905:19)
#675    AutomatedTestWidgetsFlutterBinding.drawFrame (package:flutter_test/src/binding.dart:1418:19)
#676    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:468:5)
#677    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1392:15)
#678    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1313:9)
#679    AutomatedTestWidgetsFlutterBinding.pump.<anonymous closure> (package:flutter_test/src/binding.dart:1273:9)
#682    TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:71:41)
#683    AutomatedTestWidgetsFlutterBinding.pump (package:flutter_test/src/binding.dart:1260:27)
#684    WidgetTester.pumpWidget.<anonymous closure> (package:flutter_test/src/widget_tester.dart:602:22)
#687    TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:71:41)
#688    WidgetTester.pumpWidget (package:flutter_test/src/widget_tester.dart:599:27)
#689    onlyPumpWidget (package:alchemist/src/pumps.dart:74:17)
#690    FlutterGoldenTestAdapter.pumpGoldenTest (package:alchemist/src/golden_test_adapter.dart:237:21)
#691    FlutterGoldenTestRunner.run (package:alchemist/src/golden_test_runner.dart:78:31)
#692    goldenTest.<anonymous closure> (package:alchemist/src/golden_test.dart:169:30)
<asynchronous suspension>
#693    testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:183:15)
<asynchronous suspension>
#694    TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:1017:5)
<asynchronous suspension>
<asynchronous suspension>
(elided 5 frames from dart:async and package:stack_trace)```

The problem is that focus callback is invoked during build, and from same callback android text field calls `setState()`. Given what is going on there, is the `setState` call necessary? If so then it should probably be postponed.
@miguelcmedeiros
Copy link
Collaborator

@knopp
Copy link
Contributor Author

knopp commented May 1, 2024

I updated the stacktrace if anyone is interested.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area_supertextfield Pertains to SuperTextField bounty_junior f:superlist Funded by Superlist time: 1 1hr or less
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants