Flutter: как получить доступ к данным и уведомлениям вне потока

#flutter #dart #flutter-provider #stream-builder

#флаттер #dart #flutter-provider #stream-builder

Вопрос:

У меня есть список элементов и поток внутри класса. Поток запускает будущее, в котором затем вызывается notifylisteners для обновления списка элементов. Это работает, но показывает только обновления в потоке. Как мне также уведомлять список вне потока?

Где, если бы я вызвал 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 [];
    }
  }

 

Как вы можете видеть, я разместил три разных экземпляра, в которых я могу печатать элементы после того, как notifyListeners() будет вызван в будущем ‘fetchAndSetMans’.

К сожалению, только в том случае, когда в комментарии говорится «Проверить, печатает ли список # 2», показывает, что список был обновлен. В основном, в потоковых данных.

# 1 и # 3 пусты.

Итак, что-либо вне потока, notifyListeners() не обновляет список элементов.

Я хотел бы знать, как я могу обновить значение вне потока при вызове future.

Итак, если я вызываю поставщика …. например, Provider.of(context).items… Я действительно могу получить результаты.

Спасибо, я был бы признателен за любую помощь.