Flutter- 理解Provider和Bloc的生命周期以及何时处理流的释放

4
需要了解何时应该使用Bloc模式以及Bloc的生命周期(如何释放持有内存的对象)
我有一个屏幕,从服务器获取数据并仅在单个屏幕上使用。我正在使用Bloc模式来显示数据。
在使用Bloc模式时,我有一个屏幕,其中使用StatelessWidget。我试图在“WillPopScope”上处理流。一旦处理掉,流就不能再使用了。因为我已经用Bloc包装了我的MaterialApp,所以访问相同的屏幕会导致崩溃。
1.创建了一个流
    final _leaderBoardList = StreamController<List<dynamic>>.broadcast();
  1. 处理流
    dispose() {
      print('_leaderBoardList disposed');
      _leaderBoardList.close();
    }

在提供程序中包装Material App:
使用provider库将Material App包装在提供程序内,以便更方便地访问状态管理和响应式编程。
    LeaderBoardProvider(
        child: MaterialApp(
        title: 'Table View Fetch',
        theme: ThemeData(
          primarySwatch: Colors.teal,
        ),
        home: HomeScreen(),
      ),
      );

无状态组件'WillPopScope',我已经注释掉了dispose代码,因为目前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模式是否推荐用于此情况?

1个回答

3
你不应该在 WillPopScope 中处理 BLoC 的释放。
这是你的“Provider”的工作:当提供程序小部件从树中删除时,它应该关闭流。
这是通过你的 Provider 成为一个 StatefulWidget(具有内部私有的 InheritedWidget 来公开 BLoC)并重写 dispose 方法来实现的。
请参见 Flutter: How to correctly use an Inherited Widget? 以获取示例(它与 BLoC 无关且没有 dispose,但思路类似)。

明白了,您推荐的方法是在这里回答的 https://dev59.com/HlUK5IYBdhLWcg3wiAUo#51690319。 - Ankur Prakash
1
同样在相同的链接中,您提到了“ InheritedWidget 的行为方式与其他 Widget 相同。它们的生命周期非常短:通常不超过一个 build 调用。如果您想要存储更长时间的数据,则 InheritedWidget 不是您想要的。您需要使用 State。” 仅想澄清一下,这里您指的是使用 GlobalKey 作为键的状态吗? - Ankur Prakash
请使用实际的State子类。 - Rémi Rousselet
_ViewControllerState createState() => _ViewControllerState(); }class _ViewControllerState extends State<ViewController> { // 将小部件的持久状态放在这里 @override Widget build(BuildContext context) { // 基于持久状态返回小部件 } }您是指State子类吗?请举个例子。 - Ankur Prakash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接