【问题标题】:Is it possible to add an item to a List contained in a Stream in Dart?是否可以将项目添加到 Dart 流中包含的列表中?
【发布时间】:2020-05-23 06:40:34
【问题描述】:

问题

我有一个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&lt;List&lt;T&gt;&gt;。但问题是,这个 Future 仅在稍后将某些内容添加到 Stream 后才能解决(例如,通过调用 StreamedList.updateList 函数)。

问题

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

【问题讨论】:

    标签: dart dart-stream


    【解决方案1】:

    您误解了 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();
      }
    }
    

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

    void addToList(T value) {
      _list = [..._list, value];
      _dispatch();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-22
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      相关资源
      最近更新 更多