从 Flutter 中的对话框返回值后,如何安全地调用 setState()?

How can I call setState() safely after returning a value from a dialog in Flutter?

问题出在这里:我在列表视图中显示了一个项目列表。我可以通过单击显示的对话框来编辑这些项目。编辑并关闭对话框后,我还需要更新列表视图中的项目。我目前在我的列表视图项小部件中使用以下代码片段执行此操作:

showDialog(
  context: context,
  builder: (context) {
    return UpdateItemDialog(item: _item);
  },
).then((updatedItem) {
  if (updatedItem != null) {
    setState(() => _item = updatedItem);
  }
});

并从我的对话框中调用 Navigator.of(context).pop(_item);

如果在对话框关闭之前没有重建发生,它工作得很好。但是,例如,如果在对话框打开时更改方向,我会收到 Unhandled Exception: setState() called after dispose() 错误,因为列表视图也由于方向更改而重建,并且我的代码中的 then 子句在被破坏的情况下运行小部件。

有没有办法从已销毁的小部件访问重建的小部件?

或者我应该使用不同的方法来解决这个问题?

顺便说一下,只有在关闭对话框后才能接受更改,所以我应该 return 对话框中的项目。

我相信你最好的选择是引入一个简单的状态管理解决方案(Provider 会很好)来处理对话框和其他小部件之间的通信。

查看下面的要点(运行 它在 Dartpad.dev 上)作为示例,您可以如何保持简单、干净和解耦 https://gist.github.com/romanejaquez/8aed8d699fba8fdfff4b0966dfe47663

我在其中展示了状态管理解决方案不是将数据从对话框传回另一个小部件,而是允许您以解耦的方式来回传递数据、相互通知并触发重建(这很好调用 setState() 因为这几乎就是你想要的 - 在另一个小部件上触发重建。在这个例子中,我将一个值发送回原始小部件并触发重建(感谢 Consumer 小部件监听公共服务中触发的变化。这是我的诚实建议。