3

需要了解什么时候应该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',我评论了代码的处置,因为据我了解,当前 bloc 已创建一次:
  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 模式吗?

4

1 回答 1

3

你不应该在WillPopScope.

处理 BLoC 的处置是您的“提供者”的工作:当提供者小部件从树中删除时,它应该关闭流。

这是通过您的 Provider 是一个StatefulWidget(具有内部私有InheritedWidget来公开 BLoC)和覆盖dispose方法来实现的。

请参阅Flutter:如何正确使用 Inherited Widget?例如(它与 BLoC 无关,也没有dispose,但想法相似)。

于 2019-01-19T17:50:15.810 回答