Flutter - Scoped BloCs 问题

Posted

技术标签:

【中文标题】Flutter - Scoped BloCs 问题【英文标题】:Flutter - Scoped BloCs issue 【发布时间】:2019-01-23 21:07:48 【问题描述】:

我有一个 BLoC,只要我将它作为继承的小部件访问,就可以从屏幕内的任何小部件的任何位置访问它。但是,我想显示一个对话框并在其中使用我的模型的相同实例。当我尝试将我的模型作为继承的小部件访问时,我得到一个空错误。看起来这是由于使用新上下文的新屏幕造成的。

有没有办法让我的模型用于子屏幕/对话框,而无需在构造函数中显式传递它?

【问题讨论】:

【参考方案1】:

继承小部件的全部意义在于允许您访问它而无需通过构造函数向下传递它。如果你必须通过它,你可能没有按设计使用它。

对于继承的小部件有一些注意事项。首先是它们是不可变的;你不能改变他们的数据。第二个是没有直接的方法可以单独访问一个。

您应该做的是在您的小部件树中创建一个 StatefulWidget 子类这样它在树中的位置比您需要它的任何地方都高。这意味着,如果您将它放在一个页面中,然后将新页面推送到导航器,它将无法正常工作,因为它们是导航器下小部件树中的单独分支。

查看this answer 以获取有关如何使用继承小部件的更深入示例。此外,请查看 scoped_model 包 - 它消除了继承小部件所需的大量样板。

如果您所做的只是显示一个对话框然后返回到同一页面,那么您根本不必使用 InheritedWidget - 您可以只使用一个简单的小部件,然后再将其传回。但是,如果不向您的问题添加一些代码,则很难判断您可能出错的地方。

【讨论】:

感谢您的回复!你的第三段是我的问题所在。新屏幕是小部件树中的新分支。尽管如此,有没有办法在两个分支之间共享模型?我想允许模型范围的层次结构。如果有一个单例范围(在小部件树的根部继承小部件)和一个本地范围(模型的范围为当前导航器分支“屏幕”),我目前唯一能做的。

以上是关于Flutter - Scoped BloCs 问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 Scoped Model 在 Flutter 中维护应用程序状态

Flutter / Dart 使用具有后代和 Navigator 的 Scoped Model

Flutter Scoped Model - 传递多个模型

尝试使用导航器页面访问时找不到 Flutter scoped_model

Flutter MultiBlocProvider 性能

Flutter BLoC 库中带有验证的文本字段