Создать поток, просматривающий список?

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