Flutter Freezed 模型升级后的 JsonSerializable 和 JsonKey 问题

Posted

技术标签:

【中文标题】Flutter Freezed 模型升级后的 JsonSerializable 和 JsonKey 问题【英文标题】:JsonSerializable and JsonKey issue after upgrade on Flutter Freezed model 【发布时间】:2021-12-14 19:28:35 【问题描述】:

我的应用程序运行正常,但是在 pub upgrade --major-versions 之后,我在所有模型上都遇到了问题。 示例模型:

import 'package:app_220/models/Leads/LeadFieldModel.dart';
import 'package:flutter/foundation.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:intl/intl.dart';

part 'LeadModel.freezed.dart';
part 'LeadModel.g.dart';

@freezed
abstract class LeadModel with _$LeadModel 
  const LeadModel._();

  @JsonSerializable(fieldRename: FieldRename.snake)
  const factory LeadModel(
    required int id,
    int? formId,
    @JsonKey(name: 'contact__first_name', defaultValue: '')
    @Default('')
        String contactFirstName,
    @JsonKey(name: 'contact__last_name', defaultValue: '')
    @Default('')
        String contactLastName,
    @JsonKey(name: 'contact__email', defaultValue: '')
    @Default('')
        String contactEmail,
    @JsonKey(name: 'contact__phone', defaultValue: '')
    @Default('')
        String contactPhone,
    int? staffId,
    @Default('') String staffLastName,
    DateTime? creationTime,
    @Default('') String sourceUrl,
    @Default('') String sourceIp,
    @Default(0) int viewed,
    List<LeadFieldModel>? leadData,
  ) = _LeadModel;

  factory LeadModel.fromJson(Map<String, dynamic> json) =>
      _$LeadModelFromJson(json);

问题:

The annotation 'JsonSerializable' can only be used on classes
The annotation 'JsonKey' can only be used on fields or getters
...

为了让它能在几周前的上一次升级中正常工作,我在 pubspec.yaml 中为 json_annotation: '4.0.1' 和 json_serializable: '4.1.4' 设置了一个固定版本,但不知道是否有是另一种毫无问题地更新这些软件包的方法。

我错过了什么,我怎样才能达到与使用冻结之前相同的效果?

【问题讨论】:

【参考方案1】:

作者知道这个限制as indicated here。就我个人而言,我不同意“仅禁用警告”的解决方案,因为它会使合法警告静音,这几乎不是一个有效的工程解决方案。其中提出的替代方案表示在您确定警告没有问题的任何用法之上添加以下评论:

// 忽略:invalid_annotation_target

这对于大型代码库也不是很好,但它让您有责任决定忽略什么,同时还允许您在其他地方收到有效警告。

【讨论】:

以上是关于Flutter Freezed 模型升级后的 JsonSerializable 和 JsonKey 问题的主要内容,如果未能解决你的问题,请参考以下文章

Flutter/Dart:子类化冻结的数据类

我们啥时候应该使用 freezed 作为密封类或构造函数?

Flutter开源项目 - 加密币客户端 flutter-crypto-app

Flutter:读取 build.yaml 文件中传递给 build_runner 的变量

Flutter 使用 flutter_inappbrowser 加载 H5 及与 js 交互,Methods marked with @UiThread must be executed on th

SDK 升级后 Flutter Web 中的图标错误