Flutter 在颤振中使用提供者处理流的正确方法?

Flutter 在颤振中使用提供者处理流的正确方法?,flutter,flutter-provider,Flutter,Flutter Provider,我正在使用flatter中的Provider包来处理我应用程序中的状态。 我有一个可以加载新项目的列表,所以我需要知道它的状态(已加载或准备就绪),以便在需要时添加加载进度指示器 我这样做的方式是有一个服务类(该类位于底部),它处理具有列表状态和列表本身的流;因此,当从该状态侦听新状态时,小部件可以向提供者请求具有 Widget build(BuildContext context) { var listProvider = Provider.of<ListProvider>(con

我正在使用flatter中的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]);
        },
问题是没有调用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();
  }
}