Flutter:来自后退导航的回调产生“错误状态:调用关闭后无法添加新事件”

Posted

技术标签:

【中文标题】Flutter:来自后退导航的回调产生“错误状态:调用关闭后无法添加新事件”【英文标题】:Flutter : Callback from back navigation produces "Bad state: Cannot add new events after calling close" 【发布时间】:2020-03-15 13:44:03 【问题描述】:

我有一个列表页面(有状态小部件),它是公司子公司的列表,还有一个单独的编辑页面(有状态小部件),用于编辑和删除特定子公司。列表的每一行都是一个小部件,它有一个按钮,可以将用户带到编辑页面,他也可以删除 相应的子公司。下面是这个按钮的代码

          FlatButton(
                  onPressed: () => Navigator.of(context).push(MaterialPageRoute(
                        builder: (context) =>
                            BlocProvider<SubsidiaryEditBloc>(
                                 builder: (BuildContext context) => SubsidiaryEditBloc(),
                                 child: SubsidiaryEditPage(subsidiary: subsidiary)
                             ) 
                            )).then((value) 
                              subsidiaryListBloc.dispatch(Reset()); 
                            ),
                  child: Text(
                    "Edit",
                  ),
                )

编辑/删除完成后,用户返回导航,我希望列表反映更新/删除。为了实现这一点,我在调度的“push”操作上使用“then”回调 附加到列表页面的 bloc 上的“重置”事件使 bloc 从存储库中获取子公司,就好像它们是第一次被请求一样。然而,它并不完全奏效。当一个子公司被编辑、保存并且用户导航回来时,没有任何不好的事情发生,列表被成功更新。但是,当子公司被删除时,返回会产生主题中提到的错误。我是新来的,还不知道所有的陷阱,也不清楚好的和坏的做法。这个回调是这个错误的明确来源吗?我假设它绑定到附属小部件的特定实例,以便当列表元素更改时,小部件和块被处置 - 正确吗?还是因为其他原因,我不允许在导航上调度任何 bloc 事件?

【问题讨论】:

【参考方案1】:

使用“then”关键字通常不起作用。 我在导航器之前使用 await,所以它会等待页面被弹出,然后运行你调度代码!

试试这个:

 FlatButton(
  onPressed: () async
   await Navigator.of(context).push(MaterialPageRoute(
       builder: (context) =>
          BlocProvider<SubsidiaryEditBloc>(
                builder: (BuildContext context) => SubsidiaryEditBloc(),
                child: SubsidiaryEditPage(subsidiary: subsidiary)
            ) 
          ));
    subsidiaryListBloc.dispatch(Reset()); 
     ,

              child: Text(
                "Edit",
              ),
            )

【讨论】:

试过了,没用。是的,async 和 await 比 Futures 更好,更易读,但从技术上讲,它们应该是相同的,或者不是?

以上是关于Flutter:来自后退导航的回调产生“错误状态:调用关闭后无法添加新事件”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 的底部导航中处理后退导航

Flutter Web - 无法通过浏览器的后退和前进按钮导航

处理来自操作栏的向上导航,如后退导航。如何?

Flutter单击后退按钮时如何执行

Flutter appBar后退按钮不出现

Flutter:未处理的异常:错误状态:调用关闭后无法添加新事件(不一样的情况)