flutter 冻结包无法再为嵌套对象生成toJson代码

ccgok5k5  于 2022-11-17  发布在  Flutter
关注(0)|答案(1)|浏览(157)

我们在monorepo中发现了一个问题,它阻止我们为模型生成.g.dart文件。大多数模型都是深度嵌套的,需要fromJson/toJson方法来与后端通信。三周前,我们更新了freezed和整个build_runnerc/代码生成器的设置。我们更改了以下版本:

  • json注解:^4.6.0 =〉^4.7.0
  • json_可序列化:^6.3.1 =〉^6.5.3
  • 生成运行程序:^2.1.10 =〉^2.3.2
  • 已冻结:^2.1.0+1 =〉^2.2.0
  • 冻结注解(_N):^2.0.0=〉^2.2.0

几天前,我们在运行build_runner时收到以下错误消息:

[SEVERE] json_serializable on lib/src/entities/user/user_banking_info.dart (cached):

Could not generate `toJson` code for `documents` because of type `UserDocument`.
package:common/src/entities/user/user_banking_info.freezed.dart:109:26
    ╷
109 │   List<UserDocument> get documents {
    │

在我们的monorepo的其他软件包中,我们收到了.g.dart文件尚未生成的错误消息:

Target of URI hasn't been generated: ''fetch_articles_response.g.dart''.
Try running the generator that will generate the file referenced by the URI.

使用的Flutter和Dart版本:
Flutter型:3.3.7 Dart SDK版本:2.18.4
pubspec.yaml的文章包,在公共包中使用相同的版本:

name: article
version: 0.0.1
publish_to: none

environment:
  sdk: ">=2.17.0 <3.0.0"

dependencies:
  common:
    path: ../common
  freezed_annotation: ^2.2.0
  json_annotation: ^4.7.0

dev_dependencies:
  build_runner: ^2.1.10
  freezed: ^2.1.0+1
  json_serializable: ^6.3.1

user.dart

import 'package:common/common.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

part 'user.freezed.dart';
part 'user.g.dart';

@freezed
class User with _$User {
  const User._();

  const factory User({
    UserBankingInfo? banking_info,
  }) = _User;

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
}

用户银行信息.dart

import 'package:common/src/entities/user/user_document.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'user_banking_info.freezed.dart';
part 'user_banking_info.g.dart';

@freezed
class UserBankingInfo with _$UserBankingInfo {
  const factory UserBankingInfo({
    @Default([]) List<UserDocument> documents,
  }) = _UserBankingInfo;

  factory UserBankingInfo.fromJson(Map<String, dynamic> json) => _$UserBankingInfoFromJson(json);
}

用户文档.dart

import 'package:freezed_annotation/freezed_annotation.dart';

part 'user_document.freezed.dart';
part 'user_document.g.dart';

@freezed
class UserDocument with _$UserDocument {
  const factory UserDocument({
    String? id,
  }) = _UserDocument;

  factory UserDocument.fromJson(Map<String, dynamic> json) => _$UserDocumentFromJson(json);
}

我已经尝试了所有的包版本或者包版本的组合,但是我还是找不到问题的根源。现在我降级了应用程序中的所有包版本,以匹配以前的包版本。freezed使用的每个包都存在于monorepo的每个包中。我还被迫使用json_annotation:^4.7.0,因为版本限制(json_annotation的版本限制“^4.6.0”允许4.7.0之前的版本,但这是不允许的。)。
在再次阅读冻结的文档后,我还添加了

errors:
    invalid_annotation_target: ignore

到我们的analysis_options.yaml和

targets:
  $default:
    builders:
      json_serializable:
        options:
          explicit_to_json: true

添加到每个包中的build.yaml。
我也用每个软件包的最新版本测试过,但是没有成功。降级我的Flutter SDK也没有帮助。

yacmzcpb

yacmzcpb1#

此问题已通过@SunlightBro解决,方法是使用:

dependency_overrides:
  freezed: 2.1.0

因为应用程序使用的其他依赖项将analyzer的使用限制为版本4.7.0,而不是freezed所需的5.2.0。我可以通过运行dart pub deps找到此限制。

相关问题