在Flutter中使用提供程序正确配置流的方法?

时间:2020-07-27 19:25:21

标签: flutter flutter-provider

我正在使用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();
  }
}

0 个答案:

没有答案