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

Dart StreamTransformer报错:int不是EventSink<dynamic>的子类型

解决Dart StreamTransformer中的类型不匹配错误

这个错误type 'int' is not a subtype of type 'EventSink<dynamic>' of 'data'的根源很明确——你在使用StreamTransformer时泛型参数用错了!

问题出在哪?

StreamTransformer的泛型定义是StreamTransformer<InputType, OutputType>,第一个参数是输入流的数据类型,第二个是转换后输出流的数据类型。但你写成了StreamTransformer<int, EventSink<dynamic>>,把第二个参数指定成了EventSink的类型,这完全不符合API的设计逻辑。框架会因此错误地把原本应该作为数据传递的int值,当成EventSink对象来处理,自然就抛出了类型不匹配的错误。

修正后的代码

我帮你调整了泛型参数,同时还补充了几个最佳实践的细节:

import 'dart:async';
void main() {
  StreamController<int> controller = StreamController<int>();
  num i = 0;
  
  Future.doWhile(() {
    controller.add(i++);
    if (i == 100) {
      controller.close(); // 发送完数据后关闭控制器,避免内存泄漏
      return false;
    }
    return true;
  });
  
  // 修正泛型:指定输入为int,输出为dynamic(因为既有int也有错误信息)
  var result = controller.stream.transform(
    StreamTransformer<int, dynamic>.fromHandlers(
      handleData: (int number, EventSink<dynamic> sink) {
        if (number == 70) {
          sink.addError("Hit seventy");
        } else {
          sink.add(number);
        }
      }
    )
  );
  
  // 记得监听错误,不然addError会导致程序崩溃
  result.listen(
    (data) => print(data),
    onError: (error) => print(error),
  );
}

关键修改说明

  1. 修正泛型参数:把StreamTransformer<int, EventSink<dynamic>>改为StreamTransformer<int, dynamic>,明确输入是int,输出可以是dynamic(因为我们既会输出数字,也会抛出字符串类型的错误)。
  2. 关闭StreamController:在数据发送完成后调用controller.close(),这是Dart流编程的良好习惯,能避免内存泄漏,同时让程序正常结束。
  3. 添加错误监听:在listen里加上onError回调,这样当我们调用sink.addError时,错误会被捕获并打印,而不是直接导致程序异常终止。

这样修改后,你的代码就能正常运行,数字会依次打印,当遇到70时会输出错误信息,最后正常结束程序。

内容的提问来源于stack exchange,提问作者Malouda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:23:36