如何在小部件树中保留 bloc 实例

How to persist bloc instance in widget tree

我正在使用 InheritedWidget 将 bloc class 公开给子组件。但是,每次重新创建小部件树时,都会实例化 bloc class 的一个新实例。当我使用 BehaviourSubject classes 来存储一些文本字段的最新值时,每次重新创建时我都会丢失当前值。如何解决这个问题,即 bloc class 应该只实例化一次。

这取决于您的提供程序是如何制作的,如果它是带有 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,您可以在您想要的 class 中将您的 bloc 作为构造函数参数传递,并且这个 class 也应该是有状态的,所以可以传入initState,只有再次访问才会重建。

如果您使用的是 StatefulWidget,那么您可以在 initState 方法中实例化 bloc。