#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… Я действительно могу получить результаты.
Спасибо, я был бы признателен за любую помощь.