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

标签 dart stream

问题

我有一个 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 函数)。

问题

如何将单个值添加到 ListStream里面?

最佳答案

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

关于dart - 是否可以将项目添加到 Dart 中流中包含的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60108162/

相关文章:

dart - 如何在 dart 的单元测试中设置测试的超时时间?

javascript - 如何使用 highland.js fork 流?

c++ - 多进程同步的输出流锁定?

dart - dart 可以替代 php 服务器端脚本吗?

Android 的 Wallpapermanager 在 Flutter 中?

android - 运行 "flutter run"时出现 Flutter Stripe 错误

flutter - 将数据从自定义小部件文本字段传递到计算器 flutter

java - TCP 反向代理 Minecaft 未发送原始 IP

c - 如何从文件重定向中获取命令?

javascript - 退出 NodeJS 流