Flutter-了解 Provider、Bloc 的生命周期以及何时处理流
Flutter- Understanding the lifecycle of Provider, Bloc and when to dispose the stream
需要了解什么时候应该Bloc模式和Bloc的生命周期(如何释放持有内存的对象)
我有一个屏幕,我正在从服务器获取数据,数据将仅用于单个屏幕。我正在使用 Bloc 模式来显示数据。
当使用 Bloc 模式时,我在屏幕上使用了 StatelessWidget。我正在尝试处理 'WillPopScope' 上的流。一旦处理掉,流就不能再使用了。因为访问同一个屏幕会导致崩溃,因为我用 Bloc 包装了我的 MaterialApp。
- 创建了一个流
final _leaderBoardList = StreamController<List<dynamic>>.broadcast();
- 配置流
dispose() {
print('_leaderBoardList disposed');
_leaderBoardList.close();
}
- 包装 Material 供应商内的应用程序:
LeaderBoardProvider(
child: MaterialApp(
title: 'Table View Fetch',
theme: ThemeData(
primarySwatch: Colors.teal,
),
home: HomeScreen(),
),
);
- 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 模式?
您不应在 WillPopScope
内处理 BLoC。
你的 "Provider" 的工作是处理你的 BLoC:当从树中删除提供者小部件时,它应该关闭流。
这是通过您的 Provider 成为 StatefulWidget
(具有内部私有 InheritedWidget
来公开 BLoC)并覆盖 dispose
方法来实现的。
参见 示例(它与 BLoC 无关,也没有 dispose
,但思路相似)。
需要了解什么时候应该Bloc模式和Bloc的生命周期(如何释放持有内存的对象)
我有一个屏幕,我正在从服务器获取数据,数据将仅用于单个屏幕。我正在使用 Bloc 模式来显示数据。
当使用 Bloc 模式时,我在屏幕上使用了 StatelessWidget。我正在尝试处理 'WillPopScope' 上的流。一旦处理掉,流就不能再使用了。因为访问同一个屏幕会导致崩溃,因为我用 Bloc 包装了我的 MaterialApp。
- 创建了一个流
final _leaderBoardList = StreamController<List<dynamic>>.broadcast();
- 配置流
dispose() {
print('_leaderBoardList disposed');
_leaderBoardList.close();
}
- 包装 Material 供应商内的应用程序:
LeaderBoardProvider(
child: MaterialApp(
title: 'Table View Fetch',
theme: ThemeData(
primarySwatch: Colors.teal,
),
home: HomeScreen(),
),
);
- 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 模式?
您不应在 WillPopScope
内处理 BLoC。
你的 "Provider" 的工作是处理你的 BLoC:当从树中删除提供者小部件时,它应该关闭流。
这是通过您的 Provider 成为 StatefulWidget
(具有内部私有 InheritedWidget
来公开 BLoC)并覆盖 dispose
方法来实现的。
参见 dispose
,但思路相似)。