Skip to content

Exception Thrown when using Navigator.of(context) in a Drawer #15994

@Pravez

Description

@Pravez

Steps to Reproduce

Hello everyone.

First of all thank you for Flutter, I find the entire project amazing !

I am experiencing some troubles with my Drawer. It is a classical one, but when I open it, it crashes totally giving a strange error I can't really understand. According to the error log it is the line Navigator.of(context).popUntil(ModalRoute.withName('/')); which throws the exception. Detail is that when I comment this line, the next line is in cause. Finally, if I comment everything and just add Navigator.of(context).pop(), it throws also an exception (approximately the same). I don't really know how to interpret this. I thought first it was the component I am creating in the PageRouteBuilder which was not properly constructed, but no (or, seems to be well constructed). Thank you for your help ! 👍

Logs

Here is my code :

class CookyDrawer extends StatelessWidget {
  final List<String> labels;
  CookyDrawer({this.labels});

  @override
  Widget build(BuildContext context) {
    return new Drawer(
      child: new ListView(
        padding: const EdgeInsets.only(top: 0.0),
        children: _buildDrawerList(context),
      ),
    );
  }

  _onListTileTap(BuildContext context, String labelName) {
    Navigator.of(context).popUntil(ModalRoute.withName('/'));
    Navigator.of(context).push(
        new PageRouteBuilder(
            pageBuilder: (BuildContext context, _, __) {
              return new ScannerView(title: labelName,);
            },
            transitionsBuilder: (_, Animation<double> animation, __,
                Widget child) {
              return new FadeTransition(opacity: animation, child: child,);
            }
        )
    );
  }

  List<Widget> _buildDrawerList(BuildContext context) {
    List<Widget> children = [];
    children.addAll(_buildUserAccount(context));
    children.addAll(_buildLabelWidgets(context));
    return children;
  }

  ...

  List<Widget> _buildLabelWidgets(BuildContext context) {
    List<Widget> listTiles = [];

    labels.forEach((labelName) {
      listTiles.add(
          new ListTile(
            leading: new Icon(Icons.add),
            title: new Text(labelName),
            onTap: _onListTileTap(context, labelName),
          )
      );
    });

    return listTiles;
  }
}

And here is the error log :

I/flutter ( 2929): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter ( 2929): The following assertion was thrown building CookyDrawer(dirty):
I/flutter ( 2929): setState() or markNeedsBuild() called during build.
I/flutter ( 2929): This _ModalScope widget cannot be marked as needing to build because the framework is already in the
I/flutter ( 2929): process of building widgets. A widget can be marked as needing to be built during the build phase
I/flutter ( 2929): only if one of its ancestors is currently building. This exception is allowed because the framework
I/flutter ( 2929): builds parent widgets before children, which means a dirty descendant will always be built.
I/flutter ( 2929): Otherwise, the framework might not visit this widget during this build phase.
I/flutter ( 2929): The widget on which setState() or markNeedsBuild() was called was:
I/flutter ( 2929):   _ModalScope-[LabeledGlobalKey<_ModalScopeState>#fc7b8](state: _ModalScopeState#b75dd)
I/flutter ( 2929): The widget which was currently being built when the offending call was made was:
I/flutter ( 2929):   CookyDrawer(dirty)
I/flutter ( 2929): 
I/flutter ( 2929): When the exception was thrown, this was the stack:
I/flutter ( 2929): #0      Element.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:3419)
I/flutter ( 2929): #1      Element.markNeedsBuild (package:flutter/src/widgets/framework.dart:3445)
I/flutter ( 2929): #2      State.setState (package:flutter/src/widgets/framework.dart:1124)
I/flutter ( 2929): #3      _ModalScopeState._routeSetState (package:flutter/src/widgets/routes.dart:458)
I/flutter ( 2929): #4      ModalRoute.setState (package:flutter/src/widgets/routes.dart:542)
I/flutter ( 2929): #5      ModalRoute.changedInternalState (package:flutter/src/widgets/routes.dart:971)
I/flutter ( 2929): #6      TransitionRoute&&LocalHistoryRoute.didPop (package:flutter/src/widgets/routes.dart:349)
I/flutter ( 2929): #7      NavigatorState.pop (package:flutter/src/widgets/navigator.dart:1183)
I/flutter ( 2929): #8      NavigatorState.popUntil (package:flutter/src/widgets/navigator.dart:1267)
I/flutter ( 2929): #9      CookyDrawer._onListTileTap (package:cooky_flutter/views/cooky_drawer.dart:24)
I/flutter ( 2929): #10     CookyDrawer._buildLabelWidgets.<anonymous closure> (package:cooky_flutter/views/cooky_drawer.dart:68)
I/flutter ( 2929): #11     List.forEach (dart:core-patch/dart:core/growable_array.dart:274)
I/flutter ( 2929): #12     CookyDrawer._buildLabelWidgets (package:cooky_flutter/views/cooky_drawer.dart:63)
I/flutter ( 2929): #13     CookyDrawer._buildDrawerList (package:cooky_flutter/views/cooky_drawer.dart:42)
I/flutter ( 2929): #14     CookyDrawer.build (package:cooky_flutter/views/cooky_drawer.dart:18)
I/flutter ( 2929): #15     StatelessElement.build (package:flutter/src/widgets/framework.dart:3678)
I/flutter ( 2929): #16     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3625)
I/flutter ( 2929): #17     Element.rebuild (package:flutter/src/widgets/framework.dart:3478)
I/flutter ( 2929): #18     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3605)
I/flutter ( 2929): #19     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3600)
I/flutter ( 2929): #20     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2890)
I/flutter ( 2929): #21     Element.updateChild (package:flutter/src/widgets/framework.dart:2693)
I/flutter ( 2929): #22     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3636)
I/flutter ( 2929): #23     Element.rebuild (package:flutter/src/widgets/framework.dart:3478)
I/flutter ( 2929): #24     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3605)
I/flutter ( 2929): #25     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3600)
I/flutter ( 2929): #26     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2890)
I/flutter ( 2929): #27     Element.updateChild (package:flutter/src/widgets/framework.dart:2693)
I/flutter ( 2929): #28     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4611)
I/flutter ( 2929): #29     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2890)
I/flutter ( 2929): #30     Element.updateChild (package:flutter/src/widgets/framework.dart:2693)
I/flutter ( 2929): #31     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3636)
I/flutter ( 2929): #32     Element.rebuild (package:flutter/src/widgets/framework.dart:3478)
I/flutter ( 2929): #33     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3605)
I/flutter ( 2929): #34     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3741)
I/flutter ( 2929): #35     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3600)
I/flutter ( 2929): #36     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2890)
I/flutter ( 2929): #37     Element.updateChild (package:flutter/src/widgets/framework.dart:2693)
I/flutter ( 2929): #38     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4611)
I/flutter ( 2929): #39     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2890)
I/flutter ( 2929): #40     Element.updateChild (package:flutter/src/widgets/framework.dart:2693)
I/flutter ( 2929): #41     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4611)
I/flutter ( 2929): #42     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2890)
I/flutter ( 2929): #43     Element.updateChild (package:flutter/src/widgets/framework.dart:2693)
I/flutter ( 2929): #44     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4611)
I/flutter ( 2929): #45     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2890)
I/flutter ( 2929): #46     MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4716)
I/flutter ( 2929): #47     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2890)
I/flutter ( 2929): #48     Element.updateChild (package:flutter/src/widgets/framework.dart:2693)
I/flutter ( 2929): #49     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:4611)
I/flutter ( 2929): #50     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2890)
I/flutter ( 2929): #51     Element.updateChild (package:flutter/src/widgets/framework.dart:2693)
I/flutter ( 2929): #52     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:4618)
I/flutter ( 2929): #53     Element.updateChild (package:flutter/src/widgets/framework.dart:2682)
I/flutter ( 2929): #54     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3636)
I/flutter ( 2929): #55     Element.rebuild (package:flutter/src/widgets/framework.dart:3478)
I/flutter ( 2929): #56     StatefulElement.update (package:flutter/src/widgets/framework.dart:3760)
I/flutter ( 2929): #57     Element.updateChild (package:flutter/src/widgets/framework.dart:2682)
I/flutter ( 2929): #58     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3636)
I/flutter ( 2929): #59     Element.rebuild (package:flutter/src/widgets/framework.dart:3478)
I/flutter ( 2929): #60     StatelessElement.update (package:flutter/src/widgets/framework.dart:3685)
I/flutter ( 2929): #61     Element.updateChild (package:flutter/src/widgets/framework.dart:2682)
I/flutter ( 2929): #62     Element.inflateWidget (package:flutter/src/widgets/framework.dart:2883)
I/flutter ( 2929): #63     Element.updateChild (package:flutter/src/widgets/framework.dart:2693)
I/flutter ( 2929): #64     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3636)
I/flutter ( 2929): #65     Element.rebuild (package:flutter/src/widgets/framework.dart:3478)
I/flutter ( 2929): #66     ProxyElement.update (package:flutter/src/widgets/framework.dart:3870)
I/flutter ( 2929): #67     Element.updateChild (package:flutter/src/widgets/framework.dart:2682)
I/flutter ( 2929): #68     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3636)
I/flutter ( 2929): #69     Element.rebuild (package:flutter/src/widgets/framework.dart:3478)
I/flutter ( 2929): #70     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2225)
I/flutter ( 2929): #71     BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:621)
I/flutter ( 2929): #72     BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:208)
I/flutter ( 2929): #73     BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:990)
I/flutter ( 2929): #74     BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:930)
I/flutter ( 2929): #75     BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:842)
I/flutter ( 2929): #76     _invoke (file:///b/build/slave/Linux_Engine/build/src/flutter/lib/ui/hooks.dart:120)
I/flutter ( 2929): #77     _drawFrame (file:///b/build/slave/Linux_Engine/build/src/flutter/lib/ui/hooks.dart:109)
I/flutter ( 2929): ════════════════════════════════════════════════════════════════════════════════════════════════════

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions