#flutter #dart #stream #iterable
Вопрос:
У меня есть такой глобальный список, как этот:
var data = [1,2,3];
Я добавлю в него больше элементов, и каждый раз, когда я это делаю, я хочу, чтобы было сообщено что — то еще-мне нужен поток и слушатель. Итак, могу ли я создать поток и сказать ему запустить sink.add в любое время, когда список мутирует?
var stream = Stream.fromIterable(data);
stream.listen((item) => print(item));
> 1
> 2
> 3
data.add(4);
> Uncaught Error: Concurrent modification during iteration
data.remove(3);
> Uncaught Error: Concurrent modification during iteration
О нет. Что я могу сделать, чтобы это сработало?
Ответ №1:
Это может помочь:
import 'dart:async';
class ObservableList<T> {
final _list = <T>[];
final _itemAddedStreamController = StreamController<T>();
final _listStreamController = StreamController<List<T>>();
Stream get itemAddedStream => _itemAddedStreamController.stream;
Stream get listStream => _listStreamController.stream;
void add(T value) {
_list.add(value);
_itemAddedStreamController.add(value);
_listStreamController.add(_list);
}
void dispose() {
_listStreamController.close();
_itemAddedStreamController.close();
}
}
void main() {
final observableList = ObservableList<int>();
observableList.itemAddedStream.listen((value) => print(value));
observableList.add(1);
observableList.add(2);
observableList.add(3);
observableList.add(4);
}