Flutter 在颤振中使用提供者处理流的正确方法?
我正在使用flatter中的Provider包来处理我应用程序中的状态。 我有一个可以加载新项目的列表,所以我需要知道它的状态(已加载或准备就绪),以便在需要时添加加载进度指示器 我这样做的方式是有一个服务类(该类位于底部),它处理具有列表状态和列表本身的流;因此,当从该状态侦听新状态时,小部件可以向提供者请求具有Flutter 在颤振中使用提供者处理流的正确方法?,flutter,flutter-provider,Flutter,Flutter Provider,我正在使用flatter中的Provider包来处理我应用程序中的状态。 我有一个可以加载新项目的列表,所以我需要知道它的状态(已加载或准备就绪),以便在需要时添加加载进度指示器 我这样做的方式是有一个服务类(该类位于底部),它处理具有列表状态和列表本身的流;因此,当从该状态侦听新状态时,小部件可以向提供者请求具有 Widget build(BuildContext context) { var listProvider = Provider.of<ListProvider>(con
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]);
},
问题是没有调用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();
}
}
类列表提供程序{
列表_项=[];
列表状态(u状态),;
final _listStateController=StreamController();
列表获取列表=>\u项;
Stream get listState=>\u listStateController.Stream;
无效附加项(计数)异步{
if(_state==ListState.loading)return;//当已经加载时,此行阻止加载更多项目
_状态=ListState.loading;
_添加(_state);
等待未来。延迟(持续时间(秒:2),(){});
_state=ListState.ready;
_添加(_state);
_items.addAll(new List.generate(1,())=>“Inserted new item”);
}
无效处置(){
_listStateController.close();
}
}
我还检查了Dart DevTools中的小部件树,以确保小部件已从中删除。您解决了吗?我还检查了Dart DevTools中的小部件树,以确保小部件已从中删除。您解决了吗?
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();
}
}