flutter 无法使用冻结的包生成classname.g.dart类

wwodge7n  于 2023-06-07  发布在  Flutter
关注(0)|答案(3)|浏览(200)

我有一个冻结的类,看起来像这样:

@freezed
abstract class GiftGiver with _$GiftGiver {
  const factory GiftGiver({
    String? id,
    String? uid,
    String? imageUrl,
    String? giftDetails,
    String? listingDate,
    @Default(5) int listingFor,
    Timestamp? pickUpTime,
    @Default(false) canLeaveOutside,
  }) = _GiftGiver;

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

冻结类生成良好,但.g.dart类没有生成,因为我有时间戳类型。我在www.example.com上看到了一些解决方案https://github.com/rrousselGit/freezed#fromjson---classes-with-multiple-constructors,但我不明白如何应用它来解决我的问题。

tvmytwxo

tvmytwxo1#

也许您需要在pubspec.yaml文件的dev_dependencies部分添加json_serializable包。
如果是这种情况,请删除pubspeck.lock文件,然后运行flutter pub get命令再次生成pubspeck.lock文件。
然后,运行命令flutter packages pub run build_runner build --delete-conflicting-outputs and fix以生成.g文件

lh80um4z

lh80um4z2#

经过一番研究,我找到了解决办法。对于JsonSerializable不支持的类型,我需要使用JsonKey创建自己的toJsonfromJson方法。我正在附加一个这样的类,它具有Timestamp,并且其中还有另一个嵌套类(MyPosition)。

@freezed
class GiftGiver with _$GiftGiver {
  const factory GiftGiver({
    String? id,
    required String uid,
    required String imageUrl,
    required String giftDetails,
    required String listingDate,
    required int listingFor,
    @JsonKey(fromJson: _pickedTimeFromJson, toJson: _pickedTimeToJson)
        required Timestamp pickUpTime,
    required bool canLeaveOutside,
    @JsonKey(fromJson: _fromJson, toJson: _toJson) required MyPosition position,
  }) = _GiftGiver;

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

Map<String, dynamic> _toJson(MyPosition myPosition) => myPosition.toJson();
MyPosition _fromJson(Map<String, dynamic> json) => MyPosition.fromJson(json);

Timestamp _pickedTimeToJson(Timestamp pickUpTime) => pickUpTime;
Timestamp _pickedTimeFromJson(Timestamp json) => json;

GiftGiver类使用MyPosition(另一个Freezed类),看起来像这样=>

@freezed
class MyPosition with _$MyPosition {
  const factory MyPosition({
    required String geohash,
    @JsonKey(fromJson: _geoPointFromJson, toJson: _geoPointToJson)
        required GeoPoint geopoint,
  }) = _MyPosition;

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

GeoPoint _geoPointToJson(GeoPoint geoPoint) => geoPoint;
GeoPoint _geoPointFromJson(GeoPoint json) => json;

为了在GiftGiver中正确使用MyPosition,我需要创建**_toJson_fromJson**,并告诉GiftGiver如何解码和编码MyPosition字段。

7eumitmz

7eumitmz3#

要做到这一点,你需要:

dependencies:
  # ...
  json_annotation: ^4.8.1

和/或

dev_dependencies:
  # ...
  freezed: ^2.3.4
  json_serializable: ^6.7.0

如果没有弄错的话,您需要json_serializable来生成.g.dart文件。当我添加它生成所需的文件。
我认为这是用于fromJson工厂方法。

相关问题