如何在小部件树中持久保存Bloc实例

时间:2019-05-28 13:37:01

标签: flutter dart bloc rxdart

我正在使用InheritedWidget将bloc类公开给子组件。但是,每次重新创建小部件树时,都会实例化bloc类的新实例。当我使用BehaviourSubject类存储某些文本字段的最新值时,每次娱乐都会失去当前值。这怎么解决,即bloc类只能实例化一次。

2 个答案:

答案 0 :(得分:1)

如果它是StatefulWidget的扩展,并带有InheritedWidget,则取决于提供商的方式。

如果仅从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并将其重建仅当您再次访问它时。

答案 1 :(得分:0)

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