1

问题

我有一个Stream<List>正在几个类中收听的内容,一旦将值添加到流中的列表中,我需要所有类接收更新的流。

我试过的

void main() {
  StreamedList<String> dataStream = StreamedList();

  dataStream.data.listen((list) => print(list));

  dataStream.updateList(['Apple', 'Orange']);
  dataStream.addToList('Mango');       // This is what I want to do
}

这是StreamList类的代码

class StreamedList<T> {
  StreamController<List<T>> _controller = StreamController.broadcast();

  Stream<List<T>> get data => _controller.stream;

  void updateList(List<T> list) {
    _controller.sink.add(list);
  }

  void addToList(T value) {
    // Is it possible to do this?
    // List<T> dataList = await _controller.data;
    // dataList.add(value);
    // updateList(dataList);
  }

  void dispose() {
    _controller.close();
  }
}

我尝试了dart:async库中的不同 API,包括Stream.first返回Future<List<T>>. 但问题是,这个 Future 仅在稍后将某些内容添加到 Stream 之后(例如,通过调用该StreamedList.updateList函数)才能解决。

问题

如何将单个值添加到List内部Stream

4

1 回答 1

4

您误解了 a 的Stream作用。它不“包含”数据。它仅在一端(接收器)接受数据并将其传播到另一端(流),并且任何侦听器都可以访问流对象。尝试“在流中的列表中插入项目”没有任何概念意义。

如果要推送带有其他项目的列表,请获取旧列表,将项目附加到它,然后将列表重新添加到流中。

class StreamedList<T> {
  StreamController<List<T>> _controller = StreamController.broadcast();

  Stream<List<T>> get data => _controller.stream;

  List<T> _list = [];

  void updateList(List<T> list) {
    _list = list;
    _dispatch();
  }

  void addToList(T value) {
    _list.add(value);
    _dispatch();
  }

  void _dispatch() {
    controller.sink.add(_list);
  }

  void dispose() {
    _list = null;
    _controller.close();
  }
}

如果您想要双重安全,您可以在 every 之后重新创建列表addToList,因为如果侦听器在其他地方捕获列表并修改其内容,也会产生影响_list

void addToList(T value) {
  _list = [..._list, value];
  _dispatch();
}
于 2020-02-07T06:39:03.963 回答