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