flutter - 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... 我实际上可以得到结果。
谢谢,我会很感激任何帮助。
解决方案
推荐阅读
- html - 宽度为 100vw 的 Div 不适合屏幕
- python - 如何在字符串中对管道进行单转义:意外的 str.replace 行为
- kotlin - 如何在 rxjava 中对从 Network api 返回的数据进行分组
- c# - 在不使用 Scaffold DbContext 的情况下将表添加到实体
- python - 如何通过套接字从树莓派接收视频流到我的桌面?
- sql - 组合两个返回不同行数的 SQL 查询
- java - org.springframework.util.InvalidMimeTypeException:无效的 mime 类型“application:json;charset=utf8”:不包含 '/'
- node.js - 有没有更好的方法将类参数传递给外部函数?
- symfony - 我想在 add 方法中升级表属性,当我在表中添加某些内容时,我想减少另一个表中的属性
- c++ - LinkedList RemovePosition 删除错误的元素