首页 > 解决方案 > 在 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));

标签: flutter

解决方案


你使用asyncMap正确。您的问题可能是您在Streambuilder开始收听流之前将事件添加到widget.model.results(widget.type)流。

要么使用: BehaviorSubject

  final List<BehaviorSubject> _streamControllers = [
    BehaviorSubject<List<int>>(),
    BehaviorSubject<List<int>>(),
  ];

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

如何使用 onListen 回调开始产生事件?


推荐阅读