Flutter Dart Records返回类型不匹配问题求助
问题分析与解决
错误根源
尽管BoatModel继承自Boat,但Dart编译器在处理Record返回值的类型匹配时,不会自动将List<BoatModel>隐式转换为List<Boat>?——这是泛型协变在Record上下文里的类型检查限制。而Todo相关代码能运行,只是编译器在特定上下文下的宽松推断,并非语法上的绝对兼容。
解决方法
你需要显式完成类型转换,两种安全的实现方式:
方法1:使用cast<Boat>()
修改getBoatsFromOwnership方法:
@override Future<(Failure?, List<Boat>?)> getBoatsFromOwnership(User user) async { try { final boats = await boatsDataSource.getBoatsFromOwnership(user.id); return (null, boats.cast<Boat>()); } on DatabaseException { return (DatabaseFailure(), null); } }
对getBoatsFromRelationships的返回语句做同样修改:
return (null, boats.cast<Boat>());
方法2:类型断言
直接在返回时做类型转换:
@override Future<(Failure?, List<Boat>?)> getBoatsFromOwnership(User user) async { try { return (null, await boatsDataSource.getBoatsFromOwnership(user.id) as List<Boat>?); } on DatabaseException { return (DatabaseFailure(), null); } }
关于Todo代码的差异
Todo代码能正常运行是因为编译器的类型推断上下文不同:比如方法参数、返回值的匹配逻辑让编译器自动完成了协变转换,但这属于编译器的宽松处理,并非Boat代码存在额外错误——Boat的报错才是严格遵循Dart类型系统的表现。
内容的提问来源于stack exchange,提问作者Florian
相关产品推荐
相关产品推荐

