需要了解何时应该使用Bloc模式和Bloc的生命周期(如何释放持有内存的对象)
我有一个屏幕,我正在其中从服务器中获取数据,并且数据将仅用于单个屏幕。我正在使用Bloc模式显示数据。
使用Bloc模式时,我有一个使用StatelessWidget的屏幕。我正在尝试在“ WillPopScope”上处理流。流一旦处置,将无法再使用。因为访问同一屏幕会导致崩溃,因为我用Bloc包装了MaterialApp。
final _leaderBoardList = StreamController<List<dynamic>>.broadcast();
dispose() {
print('_leaderBoardList disposed');
_leaderBoardList.close();
}
LeaderBoardProvider(
child: MaterialApp(
title: 'Table View Fetch',
theme: ThemeData(
primarySwatch: Colors.teal,
),
home: HomeScreen(),
),
);
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模式?
答案 0 :(得分:1)
您不应在WillPopScope
内处置BLoC。
“提供者”的工作是处理BLoC:这是从树中删除提供者小部件时应关闭的流。
这是通过您的提供者是StatefulWidget
(使用内部私有InheritedWidget
来公开BLoC)并覆盖dispose
方法来实现的。
有关示例,请参见Flutter: How to correctly use an Inherited Widget?(它与BLoC无关,并且没有dispose
,但思想相似)。