You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:06:00