使用sembast实现通用缓存工具时的类型错误求助
解决sembast泛型缓存工具的List类型转换编译错误
问题核心原因
从sembast查询返回的records是List<RecordSnapshot>,使用map转换时,若未明确指定泛型类型,Dart会默认推断结果为List<dynamic>,而你的方法需要返回Future<List<T>>,因此出现类型不匹配的编译错误。强制转换虽能临时消除报错,但会丢失编译期类型检查,运行时存在类型错误风险。
正确解决方法
1. 在map方法中显式指定泛型类型
直接给map方法加上<T>泛型参数,让Dart明确知道转换后的元素类型是T,最终toList()会返回List<T>:
Future<List<T>> getObjects() async { final records = await store.find(db); final objectList = records.map<T>((record) { return serializer.fromMap(record.value); }).toList(); return objectList; }
2. 显式声明变量类型
给objectList变量直接指定List<T>类型,Dart会自动验证map转换后的结果是否能兼容该类型:
Future<List<T>> getObjects() async { final records = await store.find(db); List<T> objectList = records.map((record) => serializer.fromMap(record.value)).toList(); return objectList; }
3. 确保MapSerializer的类型安全性
检查你的MapSerializer抽象类,必须保证fromMap方法的返回类型严格为T,不能是dynamic,否则即使上述步骤正确,仍可能出现类型推断问题:
abstract class MapSerializer<T> { // 必须明确返回T,不能是dynamic T fromMap(Map<String, dynamic> map); Map<String, dynamic> toMap(T object); }
为什么不建议强制转换
使用objectList as List<T>这类强制转换会跳过编译期类型检查,若serializer.fromMap返回的实际类型不是T,运行时会抛出CastError,导致程序崩溃。上述方法均为编译期安全的解决方案,能在开发阶段就发现类型问题。
内容的提问来源于stack exchange,提问作者Rusty
相关产品推荐
相关产品推荐

