代码之家  ›  专栏  ›  技术社区  ›  Ajil O. Vipin Gupta

是否可以将项目添加到Dart流中包含的列表中?

  •  0
  • Ajil O. Vipin Gupta  · 技术社区  · 5 年前

    问题

    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();
      }
    }
    

    我试过不同的API dart:async 图书馆包括 Stream.first Future<List<T>> . 但问题是,这个未来只有在以后添加到流中之后才能解决(例如,通过调用 StreamedList.updateList

    问题

    List Stream ?

    1 回复  |  直到 5 年前
        1
  •  2
  •   Abion47    5 年前

    你误会了 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();
    }
    
    推荐文章