向Stream中添加新值:直接调用sink.add方法的写法是否可行?
你的实现方式不可行,以下是具体原因和替代方案:
为什么原代码无法运行
- Dart中普通的
Stream是只读数据流,仅支持监听消费流内推送的数据,没有sink属性,调用_points.sink.add会直接抛出NoSuchMethodError运行时错误 - 只有
StreamController实例才会暴露sink接口,用于向关联的Stream中写入新数据
正确实现方案
你需要通过StreamController封装流来实现读写能力,示例代码如下:
import 'dart:async'; // 内部维护StreamController,不对外暴露 final StreamController<List<Points>> _pointsController = StreamController<List<Points>>(); // 对外仅暴露只读的Stream,防止外部随意修改流数据 Stream<List<Points>> get points => _pointsController.stream; // 写入新值的统一入口 void addNewPoints(List<Points> values) { if (!_pointsController.isClosed) { // 避免控制器关闭后写入报错 _pointsController.sink.add(values); } } // 业务逻辑结束后必须销毁控制器,避免内存泄漏 void dispose() { _pointsController.close(); }
可选配置说明
- 如果你需要多个位置同时监听这个流,可以创建广播控制器:
StreamController<List<Points>>.broadcast() - 如果你需要处理流的错误事件,可以调用
sink.addError()方法推送错误,在监听侧通过onError回调处理
内容的提问来源于stack exchange,提问作者Artur Sikora
相关产品推荐
相关产品推荐

