【发布时间】:2019-01-23 21:07:48
【问题描述】:
我有一个 BLoC,只要我将它作为继承的小部件访问,就可以从屏幕内的任何小部件的任何位置访问它。但是,我想显示一个对话框并在其中使用我的模型的相同实例。当我尝试将我的模型作为继承的小部件访问时,我得到一个空错误。看起来这是由于使用新上下文的新屏幕造成的。
有没有办法让我的模型用于子屏幕/对话框,而无需在构造函数中显式传递它?
【问题讨论】:
标签: architecture flutter inherited-widget
我有一个 BLoC,只要我将它作为继承的小部件访问,就可以从屏幕内的任何小部件的任何位置访问它。但是,我想显示一个对话框并在其中使用我的模型的相同实例。当我尝试将我的模型作为继承的小部件访问时,我得到一个空错误。看起来这是由于使用新上下文的新屏幕造成的。
有没有办法让我的模型用于子屏幕/对话框,而无需在构造函数中显式传递它?
【问题讨论】:
标签: architecture flutter inherited-widget
继承小部件的全部意义在于允许您访问它而无需通过构造函数向下传递它。如果你必须通过它,你可能没有按设计使用它。
对于继承的小部件有一些注意事项。首先是它们是不可变的;你不能改变他们的数据。第二个是没有直接的方法可以单独访问一个。
您应该做的是在您的小部件树中创建一个 StatefulWidget 子类这样它在树中的位置比您需要它的任何地方都高。这意味着,如果您将它放在一个页面中,然后将新页面推送到导航器,它将无法正常工作,因为它们是导航器下小部件树中的单独分支。
查看this answer 以获取有关如何使用继承小部件的更深入示例。此外,请查看 scoped_model 包 - 它消除了继承小部件所需的大量样板。
如果您所做的只是显示一个对话框然后返回到同一页面,那么您根本不必使用 InheritedWidget - 您可以只使用一个简单的小部件,然后再将其传回。但是,如果不向您的问题添加一些代码,则很难判断您可能出错的地方。
【讨论】: