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

标签 flutter dart bloc rxdart

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

最佳答案

这取决于您的提供程序是如何制作的,如果它是带有 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 是一个包含我所有应用程序 block 的组件。

但是,如果您的提供者使用 InheritedWidget 扩展了一个 StatefulWidget,您可以将您的 bloc 作为构造函数参数传递到您想要的类中,并且该类也应该是有状态的,因此您可以传入 initState 并将被重建仅当您再次访问它时。

关于flutter - 如何在小部件树中保留 bloc 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56343517/

相关文章:

flutter - 如何显示抽屉或bottomNavigationBar

flutter - 如何在 Windows 中以 html 形式查看代码覆盖率?

flutter - 在 Flutter 中完成 "build"函数时是否有任何回调告诉我?

android - 将 FlutterFragment 添加到 Activity?

flutter - 我如何从 Firebase 存储中删除图像

firebase - 如何在用户注销时终止通知

Flutter:Streambuilder - 关闭流

产生新状态后 flutter 状态不更新

flutter - 如何从Bloc以编程方式改变Flutter中的Stepper?

Flutter:将数据传递给状态