Flutter-了解Provider,Bloc的生命周期以及何时处置流

时间:2019-01-19 16:48:53

标签: stream flutter provider bloc inherited-widget

需要了解何时应该使用Bloc模式和Bloc的生命周期(如何释放持有内存的对象)

我有一个屏幕,我正在其中从服务器中获取数据,并且数据将仅用于单个屏幕。我正在使用Bloc模式显示数据。

使用Bloc模式时,我有一个使用StatelessWidget的屏幕。我正在尝试在“ WillPopScope”上处理流。流一旦处置,将无法再使用。因为访问同一屏幕会导致崩溃,因为我用Bloc包装了MaterialApp。

  1. 创建了一个流
    final _leaderBoardList = StreamController<List<dynamic>>.broadcast();
  1. 处理流
    dispose() {
      print('_leaderBoardList disposed');
      _leaderBoardList.close();
    }
  1. 在提供程序中包装Material App:
    LeaderBoardProvider(
        child: MaterialApp(
        title: 'Table View Fetch',
        theme: ThemeData(
          primarySwatch: Colors.teal,
        ),
        home: HomeScreen(),
      ),
      );
  1. Statelesswidget'WillPopScope',据我了解,由于当前已创建一次块,因此我评论了代码的处置:
  Widget build(BuildContext context) {

    print(' ListView fetch Build called');
    final bloc = LeaderBoardProvider.of(context);
    bloc.fetchLeaderBoards();
    return WillPopScope(
      onWillPop: () async {
        //bloc.dispose();
        return true;
      },
      child: bodyStack(context, bloc),
    );
  }

第一个问题,假设我创建了一个广播流并删除了“ WillPopScope”中的代码处置,那么一切都按预期进行,但是我认为,这样,我的Bloc会保留应用程序生命周期的内存

第二个问题,如何处理在屏幕内使用数据的情况。在这种情况下是否建议使用Bloc模式?

1 个答案:

答案 0 :(得分:1)

您不应在WillPopScope内处置BLoC。

“提供者”的工作是处理BLoC:这是从树中删除提供者小部件时应关闭的流。

这是通过您的提供者是StatefulWidget(使用内部私有InheritedWidget来公开BLoC)并覆盖dispose方法来实现的。

有关示例,请参见Flutter: How to correctly use an Inherited Widget?(它与BLoC无关,并且没有dispose,但思想相似)。