Flutter - 了解 Provider、Bloc 的生命周期以及何时处理流 [重复]

Posted

技术标签:

【中文标题】Flutter - 了解 Provider、Bloc 的生命周期以及何时处理流 [重复]【英文标题】:Flutter- Understanding the lifecycle of Provider, Bloc and when to dispose the stream [duplicate] 【发布时间】:2019-06-13 14:54:45 【问题描述】:

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

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

当使用 Bloc 模式时,我有一个使用 StatelessWidget 的屏幕。我正在尝试处理“WillPopScope”上的流。一旦处理完毕,流就不能再使用了。因为访问同一个屏幕会导致崩溃,因为我已经用 Bloc 包装了 MaterialApp。

    创建了一个流
    final _leaderBoardList = StreamController<List<dynamic>>.broadcast();
    处理流
    dispose() 
      print('_leaderBoardList disposed');
      _leaderBoardList.close();
    
    在提供者中包装 Material App:
    LeaderBoardProvider(
        child: MaterialApp(
        title: 'Table View Fetch',
        theme: ThemeData(
          primarySwatch: Colors.teal,
        ),
        home: HomeScreen(),
      ),
      );
    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】:

您不应在 WillPopScope 内处理 BLoC。

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

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

示例见Flutter: How to correctly use an Inherited Widget?(与BLoC无关,也没有dispose,但思路类似)。

【讨论】:

明白了,您正在推荐这种方法,您已在此处回答***.com/a/51690319/2644723。 同样在同一个链接中,您提到“ InheritedWidget 的行为方式与其他 Widget 相同。它们的生命周期非常短:通常不超过一次构建调用。如果您想更长时间地存储数据, InheritedWidget 不是你想要的。你需要一个 State。澄清一下,这里的意思是使用 GlobalKey 作为键? 没有。使用实际的 State 子类 _ViewControllerState createState() =&gt; _ViewControllerState(); class _ViewControllerState extends State&lt;ViewController&gt; ` // 小部件的持久状态放在这里` ` @override` Widget build(BuildContext context) // return a widget based on the persistent state ` ` 你的意思是状态子类?你能举个例子吗?

以上是关于Flutter - 了解 Provider、Bloc 的生命周期以及何时处理流 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Provider状态管理

Flutter跨组件共享状态的利器Provider简析

Flutter跨组件共享状态的利器Provider框架简析

Flutter 状态管理 | StreamBuild 局部刷新的效果Flutter局部刷新

重走Flutter状态管理之路—Riverpod进阶篇

重走Flutter状态管理之路—Riverpod进阶篇