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), ); }
关键修改说明
- 修正泛型参数:把
StreamTransformer<int, EventSink<dynamic>>改为StreamTransformer<int, dynamic>,明确输入是int,输出可以是dynamic(因为我们既会输出数字,也会抛出字符串类型的错误)。 - 关闭StreamController:在数据发送完成后调用
controller.close(),这是Dart流编程的良好习惯,能避免内存泄漏,同时让程序正常结束。 - 添加错误监听:在
listen里加上onError回调,这样当我们调用sink.addError时,错误会被捕获并打印,而不是直接导致程序异常终止。
这样修改后,你的代码就能正常运行,数字会依次打印,当遇到70时会输出错误信息,最后正常结束程序。
内容的提问来源于stack exchange,提问作者Malouda
相关产品推荐
相关产品推荐

