我正在使用 InheritedWidget 将 bloc 类公开给子组件。但是,每次重新创建小部件树时,都会实例化一个 bloc 类的新实例。当我使用 BehaviourSubject 类来存储某些文本字段的最新值时,我会在每次娱乐时丢失当前值。如何解决这个问题,即 bloc 类应该只实例化一次。
问问题
71 次
2 回答
1
这取决于您的提供者是如何制作的,如果它是带有 InheritedWidget 的 StatefulWidget 的扩展。
如果它仅从 InheritedWigdet 扩展,您将错过 dispose 方法,因为它没有从 StatefulBuilder 扩展,但永远不会再次实例化,并且 dispose 方法将在您关闭应用程序时使用。检查这个例子:
class Provider extends InheritedWidget {
Provider({Key key, Widget child}) : super(key: key, child: child);
final AppBloc bloc = AppBloc();
static AppBloc of(BuildContext context) =>
(context.inheritFromWidgetOfExactType(Provider) as Provider).bloc;
@override
bool updateShouldNotify(Provider oldWidget) => true;
}
这个 AppBloc 是一个包含我所有应用程序块的组件。
但是,如果您的提供者使用 InheritedWidget 扩展了 StatefulWidget,您可以将您的 bloc 作为构造函数参数传递给您想要的类,并且此类也应该是有状态的,因此您可以传入 initState 并且只有在您再次访问它。
于 2019-05-28T13:44:15.047 回答
-1
如果您使用的是 StatefulWidget,那么您可以在 initState 方法中实例化 bloc。
于 2019-05-28T13:45:02.660 回答