是否可以将项目添加到 Dart 中流中包含的列表?
Is it possible to add an item to a List contained in a Stream in Dart?
问题
我有一个 Stream<List>
正在几个 classes 中收听,我需要所有 classes 在将值添加到列表后接收更新的流在流中。
我试过的
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
的代码
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
等 return 和 Future<List<T>>
。但问题是这个 Future 只有在稍后将某些内容添加到 Stream 后才会解析(例如,通过调用 StreamedList.updateList
函数)。
问题
如何将单个值添加到 Stream
中的 List
?
您误解了 Stream
的作用。它没有 "contain" 数据。它仅在一端(接收器)接受数据并将其传播到另一端(流),并且任何侦听器都可以访问流式对象。尝试 "insert an item in a list within the 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();
}
问题
我有一个 Stream<List>
正在几个 classes 中收听,我需要所有 classes 在将值添加到列表后接收更新的流在流中。
我试过的
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
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
等 return 和 Future<List<T>>
。但问题是这个 Future 只有在稍后将某些内容添加到 Stream 后才会解析(例如,通过调用 StreamedList.updateList
函数)。
问题
如何将单个值添加到 Stream
中的 List
?
您误解了 Stream
的作用。它没有 "contain" 数据。它仅在一端(接收器)接受数据并将其传播到另一端(流),并且任何侦听器都可以访问流式对象。尝试 "insert an item in a list within the 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();
}