代码之家  ›  专栏  ›  技术社区  ›  Ankur Prakash

flutter-了解提供者、块的生命周期以及何时处理流[副本]

  •  0
  • Ankur Prakash  · 技术社区  · 6 年前

    这个问题已经有了答案:

    需要了解何时应该阻塞模式和阻塞的生命周期(如何释放保存内存的对象)

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

    当使用块模式时,我有一个屏幕,其中我使用的是Statelesswidget。我正在试图处理“willPopScope”上的流。一旦释放,流就不能再使用。因为访问同一个屏幕会导致崩溃,因为我用块包装了我的材料应用程序。

    1. 创建了流
        final _leaderBoardList = StreamController<List<dynamic>>.broadcast();
    
    1. 处理流
        dispose() {
          print('_leaderBoardList disposed');
          _leaderBoardList.close();
        }
    
    1. 供应商内的包装材料应用程序:
        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”中的释放代码,那么一切都将按预期工作,但我认为,这样,我的块就为应用程序的生存期保留了内存。

    第二个问题 ,如何处理在屏幕中使用数据的情况。对于这种情况,是否建议使用布洛克模式?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Rémi Rousselet    6 年前

    您不应该在 WillPopScope .

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

    这是通过您的供应商 StatefulWidget (内部私人 InheritedWidget 揭露集团)和凌驾 dispose 方法。

    Flutter: How to correctly use an Inherited Widget? 例如(它与Bloc无关,没有 处置 但想法是相似的)。

    推荐文章