Skip to content

setState in LayoutBuilder callback gives incomprehensible exception #5820

Closed

Description

@apwilson

Test code:

Future main() async {
  runApp(new Foo());
}

class Foo extends StatefulWidget {
  Foo({Key key}) : super(key: key);

  @override
  FooState createState() => new FooState();
}

class FooState extends State<Foo> {
  @override
  Widget build(BuildContext context) => new LayoutBuilder(
        builder: (BuildContext context, BoxConstraints constraints) {
          setState(() {});
          return new Container();
        },
      );
}

Exception:

10:15:52.486: I/flutter : ══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
10:15:52.491: I/flutter : The following assertion was thrown during performLayout():
10:15:52.499: I/flutter : 'package:flutter/src/widgets/framework.dart': Failed assertion: line 1539 pos 16:
10:15:52.502: I/flutter : '!_dirtyElements[index]._active || _dirtyElements[index]._debugIsInScope(context)' is not true.
10:15:52.525: I/flutter : When the exception was thrown, this was the stack:
10:15:52.536: I/flutter : #2      BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:1539:16)
10:15:52.538: I/flutter : #3      _LayoutBuilderElement._layout (package:flutter/src/widgets/layout_builder.dart:102:11)
10:15:52.540: I/flutter : #4      RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1644:58)
10:15:52.543: I/flutter : #5      PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:896:15)
10:15:52.546: I/flutter : #6      RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1644:13)
10:15:52.548: I/flutter : #7      _RenderLayoutBuilder.performLayout (package:flutter/src/widgets/layout_builder.dart:201:5)
10:15:52.551: I/flutter : #8      RenderObject.layout (package:flutter/src/rendering/object.dart:1546:21)
10:15:52.553: I/flutter : #9      RenderView.performLayout (package:flutter/src/rendering/view.dart:113:13)
10:15:52.556: I/flutter : #10     RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1424:21)
10:15:52.559: I/flutter : #11     PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:874:18)
10:15:52.561: I/flutter : #12     BindingBase&SchedulerBinding&GestureBinding&ServicesBinding&RendererBinding.beginFrame (package:flutter/src/rendering/binding.dart:202:19)
10:15:52.564: I/flutter : #13     BindingBase&SchedulerBinding&GestureBinding&ServicesBinding&RendererBinding&WidgetsBinding.beginFrame (package:flutter/src/widgets/binding.dart:297:23)
10:15:52.567: I/flutter : #14     BindingBase&SchedulerBinding&GestureBinding&ServicesBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:147:5)
10:15:52.570: I/flutter : #15     BindingBase&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:608:15)
10:15:52.573: I/flutter : #16     BindingBase&SchedulerBinding.handleBeginFrame (package:flutter/src/scheduler/binding.dart:543:9)
10:15:52.575: I/flutter : #17     runApp (package:flutter/src/widgets/binding.dart:363:7)
10:15:52.578: I/flutter : #18     main.<main_async_body> (<redacted>/lib/main.dart:14:3)
10:15:52.580: I/flutter : (elided 5 frames from class _AssertionError and package dart:async)
10:15:52.582: I/flutter : The following RenderObject was being processed when the exception was fired:
10:15:52.584: I/flutter :   _RenderLayoutBuilder NEEDS-LAYOUT
10:15:52.587: I/flutter : This RenderObject had the following creator information:
10:15:52.589: I/flutter :   LayoutBuilder ← Foo ← [root]
10:15:52.591: I/flutter : This RenderObject had the following child:
10:15:52.594: I/flutter :   RenderConstrainedBox NEEDS-LAYOUT
10:15:52.596: I/flutter : ════════════════════════════════════════════════════════════════════════════════════════════════════
10:15:52.598: I/flutter : Another exception was thrown: 'package:flutter/src/rendering/object.dart': Failed assertion: line 1867 pos 12: '!_needsLayout' is not true.

Activity

  1. Hixie commented on Sep 12, 2016

    @Hixie
    Contributor

    Ok I need to instead have that give a polite assertion explaining the problem.

  2. added this to the milestone on Sep 12, 2016
  3. added
    frameworkflutter/packages/flutter repository. See also f: labels.
    on Sep 12, 2016
  4. Hixie commented on Sep 22, 2016

    @Hixie
    Contributor

    Wow, that assertion shouldn't be hit. We must not be catching the bogus setState earlier.

  5. Hixie commented on Sep 23, 2016

    @Hixie
    Contributor

    #6024 makes this much better

  6. self-assigned this
    on Sep 23, 2016
  7. Hixie commented on Oct 13, 2016

    @Hixie
    Contributor

    It now says:

    I/flutter : ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
    I/flutter : The following assertion was thrown building LayoutBuilder:
    I/flutter : setState() or markNeedsBuild() called during build.
    I/flutter : This Foo widget cannot be marked as needing to build because the framework is already in the process
    I/flutter : of building widgets. A widget can be marked as needing to be built during the build phase only if
    I/flutter : one of its ancestors is currently building. This exception is allowed because the framework builds
    I/flutter : parent widgets before children, which means a dirty descendant will always be built. Otherwise, the
    I/flutter : framework might not visit this widget during this build phase.
    I/flutter : The widget on which setState() or markNeedsBuild() was called was:
    I/flutter :   Foo(state: FooState(552725268))
    I/flutter : The widget which was currently being built when the offending call was made was:
    I/flutter :   LayoutBuilder(renderObject: _RenderLayoutBuilder NEEDS-LAYOUT)
    I/flutter : 
    I/flutter : When the exception was thrown, this was the stack:
    I/flutter : #0      BuildableElement.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:2508:11)
    I/flutter : #2      BuildableElement.markNeedsBuild (package:flutter/src/widgets/framework.dart:2501:12)
    I/flutter : #3      State.setState (package:flutter/src/widgets/framework.dart:852:14)
    I/flutter : #4      FooState.build.<anonymous closure> (/data/user/0/com.yourcompany.scratch/cache/scratchdkstrk/lib/main.dart:19:11)
    I/flutter : #5      _LayoutBuilderElement._layout.<anonymous closure> (package:flutter/src/widgets/layout_builder.dart:112:26)
    I/flutter : #6      BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:1649:19)
    I/flutter : #7      _LayoutBuilderElement._layout (package:flutter/src/widgets/layout_builder.dart:108:11)
    I/flutter : #8      RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:1668:58)
    I/flutter : #9      PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:897:15)
    I/flutter : #10     RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:1668:13)
    I/flutter : #11     _RenderLayoutBuilder.performLayout (package:flutter/src/widgets/layout_builder.dart:207:5)
    I/flutter : #12     RenderObject.layout (package:flutter/src/rendering/object.dart:1570:21)
    I/flutter : #13     RenderView.performLayout (package:flutter/src/rendering/view.dart:113:13)
    I/flutter : #14     RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1447:21)
    I/flutter : #15     PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:875:18)
    I/flutter : #16     BindingBase&SchedulerBinding&GestureBinding&ServicesBinding&RendererBinding.beginFrame (package:flutter/src/rendering/binding.dart:217:19)
    I/flutter : #17     BindingBase&SchedulerBinding&GestureBinding&ServicesBinding&RendererBinding&WidgetsBinding.beginFrame (package:flutter/src/widgets/binding.dart:298:23)
    I/flutter : #18     BindingBase&SchedulerBinding&GestureBinding&ServicesBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:162:5)
    I/flutter : #19     BindingBase&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:648:15)
    I/flutter : #20     BindingBase&SchedulerBinding.handleBeginFrame (package:flutter/src/scheduler/binding.dart:583:9)
    I/flutter : #21     runApp (package:flutter/src/widgets/binding.dart:370:7)
    I/flutter : #22     main.<main_async_body> (/data/user/0/com.yourcompany.scratch/cache/scratchdkstrk/lib/main.dart:5:3)
    I/flutter : (elided 4 frames from class _AssertionError and package dart:async)
    I/flutter : ════════════════════════════════════════════════════════════════════════════════════════════════════
    
  8. github-actions commented on Aug 15, 2021

    @github-actions

    This thread has been automatically locked since there has not been any recent activity after it was closed. If you are still experiencing a similar issue, please open a new bug, including the output of flutter doctor -v and a minimal reproduction of the issue.

  9. locked as resolved and limited conversation to collaborators on Aug 15, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions