You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:24:03