我正在使用Flutter中的Provider程序包来处理应用程序中的状态。 我有一个列表,可以在其中加载新项目,因此我需要知道其状态(已加载或就绪),以便在需要时添加加载进度指示器。
我这样做的方式是有一个服务类(该类在底部),该服务类处理具有列表状态和列表本身的流;因此,当从状态中侦听到新状态时,小部件可以向提供者询问具有以下内容的项目列表
Widget build(BuildContext context) {
var listProvider = Provider.of<ListProvider>(context);
return StreamBuilder(
stream: listProvider.listState,
initialData: ListState.ready,
builder:...
... //next lines are placed inside the list builder (is a list of Text widgets)
itemBuilder: (context, index) {
return new Text(listProvider.list[index]);
},
在主类中,我将以下面的方式向小部件3提供服务类
Provider(
create: (_) => ListProductsProvider(),
dispose: (_, prov) => prov.dispose(),
),
问题在于未调用dispose回调,因此流永远不会关闭。这导致我无法访问构建列表的屏幕,因为它显示:
状态不良:流已经被收听。
list.provider.dart
class ListProvider {
List<String> _items = [];
ListState _state;
final _listStateController = StreamController<ListState>();
List<String> get list => _items;
Stream<ListState> get listState => _listStateController.stream;
void addItem(count) async {
if (_state == ListState.loading) return; // this line prevent from loading more items when already loading
_state = ListState.loading;
_listStateController.add(_state);
await Future.delayed(Duration(seconds: 2), () {});
_state = ListState.ready;
_listStateController.add(_state);
_items.addAll(new List.generate(1, (_) => 'Inserted new item'));
}
void dispose() {
_listStateController.close();
}
}