升级Flutter 2后Stream<dynamic>无法转为Stream<Color>报错如何解决
报错原因
Flutter 2 默认启用了严格的静态类型检查,你声明_streamListController变量时没有指定泛型参数,即使初始化时调用了StreamController<Color>.broadcast(),Dart 仍然会以变量声明时的类型为准,将该控制器识别为StreamController<dynamic>类型,因此它的stream属性类型为Stream<dynamic>,和你定义colorStream时标注的返回值类型Stream<Color>不匹配,就触发了该报错。
解决方案
只需要给_streamListController变量加上明确的Color泛型声明即可,同时建议也给colorSink加上对应类型标注,避免后续出现隐式类型隐患,修改后的完整代码如下:
class ColorBloc extends BlocBase { // streams of Color StreamController<Color> _streamListController = StreamController<Color>.broadcast(); // sink Sink<Color> get colorSink => _streamListController.sink; // stream Stream<Color> get colorStream => _streamListController.stream; // function to change the color changeColor(String chosenColour) { switch(chosenColour) { case 'blackTheme': { colorSink.add(AppState.blackTheme); } break; case 'blueTheme': { colorSink.add(AppState.blueTheme); } break; case 'greenTheme': { colorSink.add(AppState.greenTheme); } break; case 'redTheme': { colorSink.add(AppState.redTheme); } break; case 'whiteTheme': { colorSink.add(AppState.whiteTheme); } break; } } @override dispose() { _streamListController.close(); } }
修改后控制器的泛型明确为Color,其sink和stream的类型都会自动匹配对应泛型,即可解决类型不匹配的报错。
内容的提问来源于stack exchange,提问作者Bisclavret
相关产品推荐
相关产品推荐

