flutter - 在 asyncMap 未来解决后 StreamBuilder 不刷新
问题描述
我在有状态小部件中使用以下 StreamBuilder:
StreamBuilder<List<int>>(
stream: widget.model.results(widget.type),
builder: (context, snapshot) {
if (!snapshot.hasData) return CircularProgressIndicator();
if (snapshot.hasError) return Text('Error');
final List<int> results = snapshot.data;
return ListView.builder(
itemCount: results.length,
itemBuilder: (context, index) {
return _buildListTile(results[index]);
});
})
这是构建 Streams 的地方:
// inside the ViewModel
late final List<StreamController> _streamControllers = [
StreamController<List<int>>.broadcast(),
StreamController<List<int>>.broadcast(),
];
List<int> _results = [];
Stream<List<int>> results(int index) =>
_streamControllers[index]
.stream
.debounce(Duration(milliseconds: 500))
.asyncMap((filter) async {
final List<int> assets = await search(filter); // Future
return _results..addAll(assets);
});
问题是返回结果后 UI 不会重建search
。
asyncMap
调试器显示 Future 正在正确解析,但是一旦返回结果(在 内),UI 就不会重建。
我使用asyncMap
正确吗?是否有另一种设置方法可以使其正常工作?
编辑:显示将事件添加到流的代码
[0, 1].forEach((index) =>
textController.addListener(() =>
_streamControllers[index]
.sink
.add(textController[index].text));
解决方案
你使用asyncMap
正确。您的问题可能是您在Streambuilder
开始收听流之前将事件添加到widget.model.results(widget.type)
流。
要么使用: BehaviorSubject
final List<BehaviorSubject> _streamControllers = [
BehaviorSubject<List<int>>(),
BehaviorSubject<List<int>>(),
];
或者在构建小部件之后添加事件(或者当我们开始监听它们时)
推荐阅读
- html - 一种在服务器端预编译超薄模板并将 HTML 传递给 Rails 应用程序中的 VueJS 的方法?
- serialization - Kotlin 枚举在反序列化后无法转换
- google-apps-script - 传递短 URL 时 UrlFetchApp 出错
- spring-boot - CXF 3.2.2 CORS 因“不存在‘Access-Control-Allow-Origin’标头而失败”
- python - 如何改进我的共享最近邻聚类算法?
- java - 从命令行参数java获取尾随逗号输入时程序冻结
- svn - Teamforge 从数据库迁移到 Gforge 存储库
- angular - 将 swagger UI 调用与 Angular 前端调用区分开来
- angular - 如何防止从角度 6 中的日期字符串中删除零
- java - 在完全创建实例之前(在同一个构造函数内)JAVA 使用“this”关键字来引用同一个实例时,java 如何解析引用