首页 > 解决方案 > 创建一个观看列表的流?

问题描述

我有一个像这样的全局列表:

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

不好了。我能做些什么来完成这项工作?

标签: flutterdartstreamiterable

解决方案


这可能会有所帮助:

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

推荐阅读