gpt4 book ai didi

flutter - asyncMap future 解决后 StreamBuilder 不刷新

转载 作者:行者123 更新时间:2023-12-04 14:05:58 24 4
gpt4 key购买 nike

我在有状态小部件中使用以下 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);
});

问题是在 search 结果返回后,UI 没有得到重建。

调试器显示 Future 得到了正确解析,但是一旦返回结果(在 asyncMap 内),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>>(),
];

或者在构建小部件之后(或者当我们开始监听它们时)添加事件

How to use onListen callback to start producing events?

关于flutter - asyncMap future 解决后 StreamBuilder 不刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68500820/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com