首页 > 解决方案 > Flutter:如何在流外访问数据和 NotifyListener

问题描述

我有一个项目列表和一个类中的流。流触发一个 future,然后调用 notifylisteners 来更新项目列表。它可以工作,但它只显示流中的更新。我如何在流之外通知listners?

在哪里,如果我要调用 Provider.of(context).items 它不会返回为空。

下面是代码结构。

class Mans with ChangeNotifier {
  List<Man> _items = [];

  List<Man> get items {
    return [..._items];
  }

Stream<List<Man>> stream;
  bool hasMore;
  bool _isLoading;
  List<Man> _data;
  StreamController<List<Man>> _controller;

  Mans({page = 1}) {
    _data = List<Man>();
    _controller = StreamController<List<Man>>.broadcast();
    _isLoading = false;

    // Test if list prints #1
    items.forEach((list) {
      print("nono: ${list.id}");
    });

    stream = _controller.stream.map((List<Man> mansData) {
    // Test if list prints #2
    items.forEach((list) {
      print("nono: ${list.id}");
    });

      return mansData;
    });
    // Test if list prints #3
    items.forEach((list) {
      print("nono2: ${list.id}");
    });

    hasMore = true;

    refresh();
  }

Future<void> refresh() {
    return loadMore(
      page: 1,
      clearCachedData: true,
    );
  }

  Future<void> loadMore(
      {bool clearCachedData = false,
      page = 1}) async {
    if (clearCachedData) {
      _data = List<Man>();
      hasMore = true;
    }
    if (_isLoading || !hasMore) {
      return Future.value();
    }
    _isLoading = true;
    return await fetchAndSetMans(page)
        .then((mansData) {
      _isLoading = false;
      _data.addAll(mansData);
      hasMore = (mansData.isNotEmpty);
      _controller.add(_data);
    });
  }
Future<List<Man>> fetchAndSetMans(page) async {
    var cookie = '';
    try {
      print('Called_API_Mans');

      var response = await SiteApi(serverConfig["url"]).getAsync("api_link?view_id=$page");

      List<Man> list = [];

      for (var item in response) {
    //This just adds an instance of Man to the list from a Model not added to this Stack Question. It works.
        list.add(Man.fromJson(item));
      }

      _items = list;

      notifyListeners();

      return _items;
    } catch (error) {
       return [];
    }
  }

如您所见,在 Future 'fetchAndSetMans' 中调用 notifyListeners() 后,我放置了三个不同的实例,我可以在其中打印项目。

不幸的是,只有在评论说“Test if list prints #2”的地方才会显示列表已经更新。基本上,在流数据中。

#1 和 #3 是空的。

因此,流之外的任何内容 notifyListeners() 都不会更新项目列表。

我想知道在调用未来时如何更新流外部的值。

所以,如果我调用一个 Provider.... 像 Provider.of(context).items... 我实际上可以得到结果。

谢谢,我会很感激任何帮助。

标签: flutterdartflutter-providerstream-builder

解决方案


推荐阅读