Flutter 如何在小部件树中持久化bloc实例

Flutter 如何在小部件树中持久化bloc实例,flutter,dart,bloc,rxdart,Flutter,Dart,Bloc,Rxdart,我正在使用InheritedWidget向子组件公开一个bloc类。但是,每次重新创建小部件树时,都会实例化bloc类的一个新实例。当我使用Behavior Subject类存储一些文本字段的最新值时,每次重新创建都会丢失当前值。如何解决这个问题,即bloc类只能实例化一次。这取决于您的提供者是如何创建的,如果它是StatefulWidget的扩展,带有继承的widget 如果它只是从继承的Wigdet扩展,您将错过dispose方法,因为它不是从StatefulBuilder扩展的,但是,它将

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

这取决于您的提供者是如何创建的,如果它是StatefulWidget的扩展,带有继承的widget

如果它只是从继承的Wigdet扩展,您将错过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是一个包含所有我的应用程序Bloc的组件


但是,如果您的提供者使用继承的Widget扩展了一个a StatefulWidget,那么您可以在您想要的类中将您的bloc作为构造函数参数传递,并且这个类也应该是有状态的,因此您可以在initState中传递,并且只有当您再次访问它时才会重新编译。

这取决于您的提供者是如何创建的,如果它是StatefulWidget的扩展,带有继承的widget

如果它只是从继承的Wigdet扩展,您将错过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是一个包含所有我的应用程序Bloc的组件


但是,如果您的提供者使用继承的小部件扩展了一个有状态的小部件,那么您可以在您想要的类中将您的bloc作为构造函数参数传递,并且这个类也应该是有状态的,因此,您可以传入initState,并且只有当您再次访问它时才会被重新编译。

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

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