Redux 控件树被锁定时调用的颤振setState()或markNeedsBuild()

Redux 控件树被锁定时调用的颤振setState()或markNeedsBuild(),redux,dart,flutter,Redux,Dart,Flutter,我很难找到这个异常的源代码,而且这个应用程序非常复杂,所以很难显示代码的任何相关部分。这是发生错误时的我的存储库: 我怀疑以下代码可能是肇事者: Widget buildResultCard(Map result, BuildContext context) { String name = result["value"]; String description = result["label"].replaceAll(new RegExp(r"<(?:.|

我很难找到这个异常的源代码,而且这个应用程序非常复杂,所以很难显示代码的任何相关部分。这是发生错误时的我的存储库:

我怀疑以下代码可能是肇事者:

Widget buildResultCard(Map result, BuildContext context) {
    String name = result["value"];
    String description =
        result["label"].replaceAll(new RegExp(r"<(?:.|\n)*?>"), "");
    TextEditingController controller = new TextEditingController(text: name);

    Function onPressed = () {
      showDialog(
          context: context,
          child: new AlertDialog(
            title: new Text("Name your schedule"),
            content: new TextField(
              autofocus: true,
              controller: controller,
            ),
            actions: <Widget>[
              new FlatButton(
                  onPressed: () {
                    String givenName = controller.text;
                    ScheduleMeta schedule = new ScheduleMeta(
                        givenName: givenName,
                        name: name,
                        type: _selectedChoice.value,
                        description: description);

                    scheduleStore
                        .dispatch(new AddScheduleAction(schedule: schedule));

                    scheduleStore.dispatch(
                        new SetCurrentScheduleAction(schedule: schedule));

                    fetchAllSchedules(scheduleStore.state.schedules)
                        .then((weeks) {
                      scheduleStore.dispatch(
                          new SetWeeksForCurrentScheduleAction(weeks: weeks));
                    });

                    Scaffold.of(context).showSnackBar(new SnackBar(
                          content: new Text("Added " + givenName),
                          action: new SnackBarAction(
                              label: "Undo",
                              onPressed: () {
                                scheduleStore.dispatch(
                                    new RemoveScheduleAction(schedule: name));

                                Scaffold.of(context).showSnackBar(new SnackBar(
                                      content: new Text(
                                          "Deleted " + givenName),
                                    ));
                              }),
                        ));

                    Navigator.of(context).pop();
                  },
                  child: new Text("Add")),
            ],
          ));
    };

    return new Card(
      child: new Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          new ListTile(
            leading: const Icon(Icons.schedule),
            title: new Text(name),
            subtitle: new Text(description),
            isThreeLine: true,
            dense: true,
          ),
          new ButtonTheme.bar(
            child: new ButtonBar(
              children: <Widget>[
                new FlatButton(
                    child: const Text('Add Schedule'),
                    onPressed: scheduleStore.state.schedules
                            .any((schedule) => schedule.name == name)
                        ? null
                        : onPressed)
              ],
            ),
          ),
        ],
      ),
    );
  }
Widget buildResultCard(映射结果、构建上下文){
字符串名称=结果[“值”];
字符串描述=
结果[“label”].replaceAll(新的RegExp(r“),”);
TextEditingController=新的TextEditingController(文本:名称);
函数onPressed=(){
显示对话框(
上下文:上下文,
子:新建警报对话框(
标题:新文本(“列出您的时间表”),
内容:新文本字段(
自动对焦:对,
控制器:控制器,
),
行动:[
新扁平按钮(
已按下:(){
字符串givenName=controller.text;
ScheduleMeta schedule=新ScheduleMeta(
吉文纳姆:吉文纳姆,
姓名:姓名,,
类型:_selectedChoice.value,
说明:说明);
调度存储
.调度(新的AddScheduleAction(调度:调度));
调度存储(
新的SetCurrentScheduleAction(schedule:schedule));
fetchAllSchedules(scheduleStore.state.schedules)
.然后((周){
调度存储(
新SetWeekForCurrentScheduleAction(周:周));
});
Scaffold.of(上下文).showSnackBar(新的SnackBar(
内容:新文本(“添加”+givenName),
行动:新SnackBarAction(
标签:“撤消”,
已按下:(){
调度存储(
新RemoveScheduleAction(计划:名称));
Scaffold.of(上下文).showSnackBar(新的SnackBar(
内容:新文本(
“删除”+givenName),
));
}),
));
Navigator.of(context.pop();
},
子项:新文本(“添加”),
],
));
};
归还新卡(
子:新列(
mainAxisSize:mainAxisSize.min,
儿童:[
新ListTile(
前导:常量图标(图标.时间表),
标题:新文本(名称),
副标题:新文本(说明),
伊斯特里琳:是的,
是的,
),
新钮扣。新钮扣(
孩子:新纽扣吧(
儿童:[
新扁平按钮(
子项:常量文本(“添加明细表”),
onPressed:scheduleStore.state.schedules
.any((schedule)=>schedule.name==name)
无效的
:ON按下)
],
),
),
],
),
);
}
显示对话框时会出现错误,当用户按下对话框上的按钮时,两个Redux store Dispatch会直接在对方之后发送。对话框后面的UI订阅Redux存储中的更改

我认为Dart/Flatter是单线程的,所以不会发生这样的冲突,其中一个线程似乎正在调用小部件上的setState(),而另一个线程在小部件树上设置了锁

是否有一种方法可以检查小部件树是否被锁定,从而避免这种情况

堆栈提供以下信息:

I/flutter (13466): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (13466): The following assertion was thrown while finalizing the widget tree:
I/flutter (13466): setState() or markNeedsBuild() called when widget tree was locked.
I/flutter (13466): This _ModalScope widget cannot be marked as needing to build because the framework is locked.
I/flutter (13466): The widget on which setState() or markNeedsBuild() was called was:
I/flutter (13466):   _ModalScope([LabeledGlobalKey<_ModalScopeState>#cb4cc]; state: _ModalScopeState#d4c02())
I/flutter (13466): 
I/flutter (13466): When the exception was thrown, this was the stack:
I/flutter (13466): #0      Element.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:3250)
I/flutter (13466): #2      Element.markNeedsBuild (package:flutter/src/widgets/framework.dart:3226)
I/flutter (13466): #3      State.setState (package:flutter/src/widgets/framework.dart:1072)
I/flutter (13466): #4      _ModalScopeState._routeSetState (package:flutter/src/widgets/routes.dart:473)
I/flutter (13466): #5      ModalRoute.setState (package:flutter/src/widgets/routes.dart:552)
I/flutter (13466): #6      ModalRoute.changedInternalState (package:flutter/src/widgets/routes.dart:889)
I/flutter (13466): #7      TransitionRoute&&LocalHistoryRoute.removeLocalHistoryEntry (package:flutter/src/widgets/routes.dart:317)
I/flutter (13466): #8      LocalHistoryEntry.remove (package:flutter/src/widgets/routes.dart:267)
I/flutter (13466): #9      DrawerControllerState.dispose (package:flutter/src/material/drawer.dart:147)
I/flutter (13466): #10     StatefulElement.unmount (package:flutter/src/widgets/framework.dart:3550)
I/flutter (13466): #11     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1626)
I/flutter (13466): #12     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1624)
I/flutter (13466): #13     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3427)
I/flutter (13466): #14     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1622)
I/flutter (13466): #15     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1624)
I/flutter (13466): #16     MultiChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:4421)
I/flutter (13466): #17     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1622)
I/flutter (13466): #18     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1624)
I/flutter (13466): #19     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3427)
I/flutter (13466): #20     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1622)
I/flutter (13466): #21     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1624)
I/flutter (13466): #22     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3427)
I/flutter (13466): #23     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1622)
I/flutter (13466): #24     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1624)
I/flutter (13466): #25     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:4321)
I/flutter (13466): #26     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1622)
I/flutter (13466): #27     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1624)
I/flutter (13466): #28     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3427)
I/flutter (13466): #29     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1622)
I/flutter (13466): #30     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1624)
I/flutter (13466): #31     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:4321)
I/flutter (13466): #32     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1622)
I/flutter (13466): #33     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1624)
I/flutter (13466): #34     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3427)
I/flutter (13466): #35     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1622)
I/flutter (13466): #36     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1624)
I/flutter (13466): #37     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3427)
I/flutter (13466): #38     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1622)
I/flutter (13466): #39     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1624)
I/flutter (13466): #40     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3427)
I/flutter (13466): #41     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1622)
I/flutter (13466): #42     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1624)
I/flutter (13466): #43     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3427)
I/flutter (13466): #44     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1622)
I/flutter (13466): #45     _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:1624)
I/flutter (13466): #46     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3427)
I/flutter (13466): #47     _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:1622)
I/flutter (13466): #48     _InactiveElements._unmountAll (package:flutter/src/widgets/framework.dart:1636)
I/flutter (13466): #49     BuildOwner.finalizeTree.<anonymous closure> (package:flutter/src/widgets/framework.dart:2228)
I/flutter (13466): #50     BuildOwner.lockState (package:flutter/src/widgets/framework.dart:2060)
I/flutter (13466): #51     BuildOwner.finalizeTree (package:flutter/src/widgets/framework.dart:2227)
I/flutter (13466): #52     BindingBase&SchedulerBinding&GestureBinding&ServicesBinding&RendererBinding&WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:505)
I/flutter (13466): #53     BindingBase&SchedulerBinding&GestureBinding&ServicesBinding&RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:189)
I/flutter (13466): #54     BindingBase&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:688)
I/flutter (13466): #55     BindingBase&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:636)
I/flutter (13466): #56     _drawFrame (file:///b/build/slave/Linux_Engine/build/src/flutter/lib/ui/hooks.dart:70)
I/flutter (13466): (elided one frame from class _AssertionError)
I/flutter (13466): ════════════════════════════════════════════════════════════════════════════════════════════════════
I/颤振(13466):══╡ WIDGETS库捕获到异常╞═══════════════════════════════════════════════════════════
I/flatter(13466):在完成小部件树时抛出以下断言:
I/flatter(13466):当小部件树被锁定时调用setState()或markNeedsBuild()。
I/flatter(13466):由于框架已锁定,因此无法将此_ModalScope小部件标记为需要构建。
I/flatter(13466):调用setState()或markNeedsBuild()的小部件是:
I/颤振(13466):_模态镜([LabeledGlobalKey#cb4cc];状态:_模态镜状态#d4c02())
I/颤振(13466):
I/flatter(13466):当抛出异常时,这是堆栈:
I/颤振(13466):#0元素。标记需要构建。(包:flatter/src/widgets/framework.dart:3250)
I/flatter(13466):#2 Element.markNeedsBuild(包:flatter/src/widgets/framework.dart:3226)
I/flatter(13466):#3 State.setState(包:flatter/src/widgets/framework.dart:1072)
I/flatter(13466):#4 ModalScopeState.routeSetState(包:flatter/src/widgets/routes.dart:473)
I/flatter(13466):#5 ModalRoute.setState(包:flatter/src/widgets/routes.dart:552)
I/flatter(13466):#6 ModalRoute.changedInternalState(包:flatter/src/widgets/routes.dart:889)
I/flatter(13466):#7 TransitionRoute&&LocalHistoryRoute.removeLocalHistoryEntry(包:flatter/src/widgets/routes.dart:317)
I/flatter(13466):#8 LocalHistoryEntry.remove(包:flatter/src/widgets/routes.dart:267)
I/颤振(13466):#9抽屉控制器状态。处置(包装:颤振/src/材料/抽屉。省道:147)
I/flatter(13466):#10 StatefulElement.unmount(包:flatter/src/widgets/framework.dart:3550)
I/flatter(13466):#11个非活动元素。"卸载(包:flatter/src/widgets/framework.dart:1626)
I/颤振(13466):#12个不活动元件。#卸载。(包装:颤振/src/wid
Widget build(BuildContext context) {
    myParentWidgetState.setState(() { print("foo"); });
    return Container();
}
Widget build(BuildContext context) {
    Navigator.pop(context);
    return Container();
}
import 'dart:async';

@override
void initState() {
  super.initState();

  Timer.run(() {
    // You can call setState from here
  });
}
  WidgetsBinding.instance
              .addPostFrameCallback((_) {
            //valueNotifier.value = _pcm; //provider
            //setState
          });
  void initState() {
    super.initState();
    if (auth.getUser != null) {
      // ERROR
      // Navigator.pushReplacementNamed(context, '/home');

      // SUCCESS
      // WidgetsBinding.instance.addPostFrameCallback((_) => setState(() {
      //       Navigator.pushReplacementNamed(context, '/home');
      //     }));

      // SUCCESS
      Timer.run(() {
        Navigator.pushReplacementNamed(context, '/home');
      });
    }
  }