Flutter使用BLoC+rxdart向Sink传值报Stream<List<T>>类型不匹配错误如何解决
错误原因
你触发报错的核心原因是:_empresaDatosProvider.cargarEmpresasStream()返回的是Stream<List<EmpresaDatosModel>>类型的流对象,而_empresaDatosController.sink.add()方法要求传入的是List<EmpresaDatosModel>类型的具体数据值,你直接把流塞给了要具体值的方法,自然类型不匹配。
修复方案
提供两种常用的实现方式,按需选择即可:
方案1:监听Provider返回的流,拿到数据后再传入Sink
修改你的BLoC层cargarEmpresasStream方法即可,该方案灵活性高,可在回调中增加异常捕获、数据预处理逻辑:
// 修改后的BLoC层方法 Future<void> cargarEmpresasStream() async { // 拿到Provider返回的流 final empresasStream = _empresaDatosProvider.cargarEmpresasStream(); // 监听流的每一次数据更新,把拿到的列表数据传入Sink empresasStream.listen( (empresasList) => _empresaDatosController.sink.add(empresasList), // 可选:增加异常处理逻辑 onError: (e) => _empresaDatosController.sink.addError(e), ); }
方案2:直接把Provider的流绑定到Subject上
如果你不需要对数据做额外处理,也可以直接用addStream方法把整个流绑定到你的BehaviorSubject上,后续流的所有更新都会自动同步到Subject:
// 修改后的BLoC层方法 Future<void> cargarEmpresasStream() async { final empresasStream = _empresaDatosProvider.cargarEmpresasStream(); await _empresaDatosController.addStream(empresasStream); }
可选优化:前端代码简化
你当前的StreamBuilder里的列表处理逻辑可以简化,不需要手动遍历拷贝,同时指定泛型可避免强转操作:
return StreamBuilder<List<EmpresaDatosModel>>( stream: empresaDatosBloc.empresaDatosStream, builder: (BuildContext context, snapshot){ // 直接用空判断+默认值就能拿到可用的列表 final empresasList = snapshot.data ?? []; // 后续直接使用empresasList渲染即可 } );
内容的提问来源于stack exchange,提问作者David L
相关产品推荐
相关产品推荐

