升级空安全后built_value报错:Serializer<dynamic>无法赋值给Serializer<SingleItemType>
报错原因
空安全版本的built_value强化了泛型类型校验,serializers.serializerForType()方法返回值类型为Serializer<dynamic>,而deserializeWith<SingleItemType>要求入参为Serializer<SingleItemType>,两者类型不匹配触发编译错误。
修复方案
在获取到对应类型的序列化器后,手动执行泛型类型强转即可,仅需要修改_deserialize方法中的deserializeWith调用行:
return serializers.deserializeWith<SingleItemType>( // 新增as强转,将dynamic类型的序列化器转为指定泛型的序列化器 serializers.serializerForType(SingleItemType)! as Serializer<SingleItemType>, value, );
修改后完整代码
import 'package:chopper/chopper.dart'; import 'package:built_collection/built_collection.dart'; import 'package:flutter_netflix_responsive_ui/models/serializers.dart'; class BuiltValueConverter extends JsonConverter { @override Response<BodyType> convertResponse<BodyType, SingleItemType>( Response response) { final Response dynamicResponse = super.convertResponse(response); final BodyType customBody = _convertToCustomObject<SingleItemType>(dynamicResponse.body); return dynamicResponse.copyWith<BodyType>(body: customBody); } dynamic _convertToCustomObject<SingleItemType>(dynamic element) { // 如果响应应返回的类型已明确设置为dynamic Map,则无需转换 if (element is SingleItemType) return element; if (element is List) return _deserializeListOf<SingleItemType>(element); else return _deserialize<SingleItemType>(element); } BuiltList<SingleItemType> _deserializeListOf<SingleItemType>( List dynamicList, ) { // 生成存储单个自定义对象的BuiltList return BuiltList<SingleItemType>( dynamicList.map((element) => _deserialize<SingleItemType>(element)), ); } SingleItemType? _deserialize<SingleItemType>( Map<String, dynamic> value, ) { // 反序列化后返回对应BuiltValue类型的泛型参数 return serializers.deserializeWith<SingleItemType>( serializers.serializerForType(SingleItemType)! as Serializer<SingleItemType>, value, ); } }
内容的提问来源于stack exchange,提问作者Ngodiseni Netshifhefhe
相关产品推荐
相关产品推荐

