使用RxDart合并两个stream时出现语法错误该如何解决?
报错原因
- 空安全类型不匹配:Dart 2.12+开启空安全后,
firstWhere默认返回非空类型,你设置的orElse: () => null不符合返回值类型约束,直接触发语法报错。 - RxDart泛型推导失败:
Rx.combineLatest2未显式声明泛型参数时,Dart类型推导可能无法正确识别两个输入流和输出流的类型,抛出类型不匹配错误。 - 实体类参数不支持空值:如果
EntryJob的构造函数第二个参数声明为非空Job类型,传入可能为null的job变量也会触发类型报错。
修复方案
步骤1:修复firstWhere空返回问题
两种方案二选一即可:
- (推荐)使用collection包的
firstWhereOrNull扩展方法,首先在pubspec.yaml中添加collection依赖,然后替换对应代码:
final job = jobs.firstWhereOrNull((job) => job.id == entry.jobId);
- 无需新增依赖的方案,给
firstWhere显式指定可空返回类型:
final job = jobs.firstWhere<Job?>((job) => job.id == entry.jobId, orElse: () => null);
步骤2:给combineLatest2显式指定泛型
避免类型推导错误,修改流定义代码:
Stream<List<EntryJob>> get _allEntriesStream => Rx.combineLatest2<List<Entry>, List<Job>, List<EntryJob>>( database.entriesStream(), database.jobsStream(), _entriesJobsCombiner, );
步骤3:调整EntryJob参数为可空类型
修改EntryJob类的定义,允许job参数为空:
class EntryJob { final Entry entry; final Job? job; const EntryJob(this.entry, this.job); }
内容的提问来源于stack exchange,提问作者Muhammad Saqib Aziz
相关产品推荐
相关产品推荐

