Flutter Freezed生成代码未调用LatLng的toJson(),编码失败如何解决?
修复LatLng字段的JSON编码问题
你遇到的问题是因为json_serializable默认不会自动调用第三方类(比如LatLng)的toJson()方法——虽然它能识别fromJson(),但编码时需要显式指定转换逻辑。下面给两种可行的修复方案:
方案一:自定义Json转换器
先创建一个专门处理LatLng和JSON互转的转换器类:
import 'package:json_annotation/json_annotation.dart'; import 'package:latlong2/latlong.dart'; class LatLngConverter implements JsonConverter<LatLng, Map<String, dynamic>> { const LatLngConverter(); @override LatLng fromJson(Map<String, dynamic> json) => LatLng.fromJson(json); @override Map<String, dynamic> toJson(LatLng object) => object.toJson(); }
然后在Event类的location字段上添加这个转换器注解:
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:latlong2/latlong.dart'; part 'event.freezed.dart'; part 'event.g.dart'; @freezed class Event with _$Event { const factory Event({ @LatLngConverter() required LatLng location, required DateTime date, required String name, }) = _Event; factory Event.fromJson(Map<String, Object?> json) => _$EventFromJson(json); }
方案二:直接通过@JsonKey指定转换方法
不用写转换器类,直接在字段上用@JsonKey显式绑定fromJson和toJson逻辑。注意LatLng.toJson()是实例方法,需要单独写一个顶层函数来包装:
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:latlong2/latlong.dart'; import 'package:json_annotation/json_annotation.dart'; part 'event.freezed.dart'; part 'event.g.dart'; // 包装LatLng的toJson方法,作为顶层函数供@JsonKey调用 Map<String, dynamic> _latLngToJson(LatLng latLng) => latLng.toJson(); @freezed class Event with _$Event { const factory Event({ @JsonKey( fromJson: LatLng.fromJson, toJson: _latLngToJson, ) required LatLng location, required DateTime date, required String name, }) = _Event; factory Event.fromJson(Map<String, Object?> json) => _$EventFromJson(json); }
完成上述修改后,重新运行build_runner生成代码,你会看到_$$_EventToJson里的location字段会调用对应的转换方法,编码就能正常工作了。
内容的提问来源于stack exchange,提问作者Kulpas
相关产品推荐
相关产品推荐

