Skip to content

The error message when you show a snackbar during build is unintuitive #66789

@Hixie

Description

@Hixie

We should catch it explicitly in the scaffold code and say something like "Snackbars cannot be shown during build" or some such.

I/flutter (30702): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (30702): The following assertion was thrown building _BodyBuilder:
I/flutter (30702): setState() or markNeedsBuild() called during build.
I/flutter (30702): This Scaffold widget cannot be marked as needing to build because the framework is already in the
I/flutter (30702): process of building widgets.  A widget can be marked as needing to be built during the build phase
I/flutter (30702): only if one of its ancestors is currently building. This exception is allowed because the framework
I/flutter (30702): builds parent widgets before children, which means a dirty descendant will always be built.
I/flutter (30702): Otherwise, the framework might not visit this widget during this build phase.
I/flutter (30702): The widget on which setState() or markNeedsBuild() was called was:
I/flutter (30702):   Scaffold
I/flutter (30702): The widget which was currently being built when the offending call was made was:
I/flutter (30702):   _BodyBuilder
I/flutter (30702): 
I/flutter (30702): The relevant error-causing widget was:
I/flutter (30702):   Scaffold file:///home/ianh/dev/ant/lib/main.dart:12:11
I/flutter (30702): 
I/flutter (30702): When the exception was thrown, this was the stack:
I/flutter (30702): #0      Element.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:4284:11)
I/flutter (30702): #1      Element.markNeedsBuild (package:flutter/src/widgets/framework.dart:4299:6)
I/flutter (30702): #2      State.setState (package:flutter/src/widgets/framework.dart:1275:15)
I/flutter (30702): #3      ScaffoldState.showSnackBar (package:flutter/src/material/scaffold.dart:1731:5)
I/flutter (30702): #4      _BoardViewState.showMessage (package:ant/main.dart:207:26)
I/flutter (30702): #5      _BoardViewState._toggle (package:ant/main.dart:202:7)
I/flutter (30702): #6      _BoardViewState.initState (package:ant/main.dart:162:5)
I/flutter (30702): #7      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4778:57)
I/flutter (30702): #8      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4615:5)
I/flutter (30702): ...     Normal element mounting (19 frames)
I/flutter (30702): #27     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3581:14)
I/flutter (30702): #28     MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6248:32)
I/flutter (30702): ...     Normal element mounting (202 frames)
I/flutter (30702): #230    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3581:14)
I/flutter (30702): #231    MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6248:32)
I/flutter (30702): ...     Normal element mounting (267 frames)
I/flutter (30702): #498    Element.inflateWidget (package:flutter/src/widgets/framework.dart:3581:14)
I/flutter (30702): #499    Element.updateChild (package:flutter/src/widgets/framework.dart:3346:18)
I/flutter (30702): #500    RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:1215:16)
I/flutter (30702): #501    RenderObjectToWidgetElement.mount (package:flutter/src/widgets/binding.dart:1186:5)
I/flutter (30702): #502    RenderObjectToWidgetAdapter.attachToRenderTree.<anonymous closure> (package:flutter/src/widgets/binding.dart:1128:18)
I/flutter (30702): #503    BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2696:19)
I/flutter (30702): #504    RenderObjectToWidgetAdapter.attachToRenderTree (package:flutter/src/widgets/binding.dart:1127:13)
I/flutter (30702): #505    WidgetsBinding.attachRootWidget (package:flutter/src/widgets/binding.dart:967:7)
I/flutter (30702): #506    WidgetsBinding.scheduleAttachRootWidget.<anonymous closure> (package:flutter/src/widgets/binding.dart:948:7)
I/flutter (30702): (elided 11 frames from class _RawReceivePortImpl, class _Timer, dart:async, and dart:async-patch)
I/flutter (30702): 
I/flutter (30702): ════════════════════════════════════════════════════════════════════════════════════════════════════

Metadata

Metadata

Assignees

Labels

P3Issues that are less important to the Flutter projecta: error messageError messages from the Flutter frameworka: qualityA truly polished experienceframeworkflutter/packages/flutter repository. See also f: labels.r: fixedIssue is closed as already fixed in a newer version

Type

No type

Projects

Status

Done (PR merged)

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions