在楼层实体中使用带有 TypeConverter 的非默认类型时出错

问题描述 投票:0回答:2

在实体类中使用默认类型以外的类型时,我遇到了一个简单的错误。当我运行

dart run build_runner build --delete-conflicting-outputs
命令生成 appdatabase.g.dart 文件时发生错误:

[SEVERE] floor_generator on lib/database/AppDatabase.dart:
Column type is not supported for AgroData?'

我遵循以下此文档

将非默认类型与实体关联的过程

这是我的文件:

Parcel.dart:我尝试将自定义对象“AgroData”与 TypeConverters 一起使用的文件

part 'Parcel.g.dart';

@Entity(primaryKeys: ['localId'])
@JsonSerializable()
class Parcel extends CustomEntity {

  String? name;
  String? exploitationName;
  String? forfaits;

  @TypeConverters([AgroDataConverter])
  final AgroData? agroData;

  String? cultivation;
  String? varietyName;
  double? surface;
  int? sowingDate;
  String? geoDataUrl;

  //local
  int nbOfStages;

  // init
  Parcel({
    required this.name,
    required this.exploitationName,
    required this.forfaits,
    required this.agroData,
    required this.cultivation,
    required this.varietyName,
    required this.surface,
    required this.sowingDate,
    required this.nbOfStages,
    required this.geoDataUrl,
    required int? localId,
    required String? serverId,
    required int creationDate,
    required int lastModifDate,
  }) : super(localId, serverId, creationDate, lastModifDate);
}

AgroData.dart:我尝试转换的自定义实体的文件

part 'AgroData.g.dart';

@Entity(primaryKeys: ['localId'])
@JsonSerializable()
class AgroData extends CustomEntity {

  @JsonKey(name: "culturePrecedente")
  String? previousCulture;

  int? createdAt;

  int? updatedAt;

  // init
  AgroData({
    required int? localId,
    required String? serverId,
    required int creationDate,
    required int lastModifDate,
    this.previousCulture,
    this.createdAt,
    this.updatedAt,
  }) : super(localId, serverId, creationDate, lastModifDate);

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

  Map<String, dynamic> toJson() => _$AgroDataToJson(this);
}

CustomEntity.dart :AgroData继承的类

part 'CustomEntity.g.dart';

@JsonSerializable()
class CustomEntity {

  @PrimaryKey(autoGenerate: true)
  int? localId;

  @JsonKey(name: "_id")
  String? serverId;

  int creationDate;

  int lastModifDate;

  CustomEntity(this.localId, this.serverId, this.creationDate, this.lastModifDate);

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

  Map<String, dynamic> toJson() => _$CustomEntityToJson(this);
}

AgroDataConverter.dart :AgroData 的转换器,配合 Parcel.dart 上的注解使用来转换类型

class AgroDataConverter extends TypeConverter<AgroData, String> {

  @override
  AgroData decode(String databaseValue) {
    return AgroData.fromJson(jsonDecode(databaseValue) as Map<String, dynamic>);
  }

  @override
  String encode(AgroData value) {
    return jsonEncode(value.toJson());
  }
}

我确定我遵循了文档,但错误仍然存在。我想指出的是,虽然 TypeConverters 注释位于实体属性级别,但我也尝试将其放在实体级别本身以及我的 AppDatabase.dart 文件级别,但错误仍然存在。

flutter auto-generate typeconverter flutter-floor
2个回答
1
投票

您是否尝试过取消

AgroData
的空安全性(即将
final AgroData? agroData;
文件中的
final AgroData agroData;
更改为
Parcel.dart

也许插件不支持 nullable 在数据库中转换?


0
投票

final AgroData? agroData;
更改为定义实体的
required AgroData agroData;
。 那是因为不支持可为空。

© www.soinside.com 2019 - 2024. All rights reserved.