保存Hive-Flutter中的继承类



我正在进行一个项目,在该项目中,您可以将音频、视频和形状(如长方体、圆形、三角形等(添加到特定的工作区,并且您可以更改工作区中所有这些对象的位置

所以我创建了一个抽象类,包含共享属性在偏移量、类型、大小等所有对象之间。。。

abstract class ElementProperites {
//! Element_Properites Offest
@HiveField(0)
Offset _elementOffest = Offset.zero;
Offset get elementOffest => _elementOffest;
set setElementOffest(Offset value) => _elementOffest = value;
//!Element_Properites Type
@HiveField(1)
String _elementType = '';
String get elementType => _elementType;
set setElementType(String value) => _elementType = value;
//!Element_Properites Size
@HiveField(2)
Size _elementSize = Size.zero;
Size get elementSize => _elementSize;
set setElementSize(Size value) => _elementSize = value;
//!Element_Properites defualt Size
@HiveField(3)
Size _elementdefualtSize = Size.zero;
Size get elementdefualtSize => _elementdefualtSize;
set setElementdefualtSize(Size value) => _elementdefualtSize = value;
//!Element showBorder
@HiveField(4)
bool _elementShowBorder = false;
bool get elementShowBorder => _elementShowBorder;
set setElementShowBorder(bool value) => _elementShowBorder = value;
//!Element Look
@HiveField(5)
bool _elementLockOption = false;
bool get elementLockOption => _elementLockOption;
set setElementLockOption(bool value) => _elementLockOption = value;
//! The index of Page Where Element Exist
@HiveField(6)
int _pageNumber = 0;
int get pageNumber => _pageNumber;
set setPageNumber(int value) => _pageNumber = value;
//? Hive Box
//! save method
void saveElement({required Object object});
//! intial Hive Box
Future initHiveBox({required String hiveBoxName});
}

并且每一个对象都具有类来扩展抽象类。

例如形状类

@HiveType(typeId: 1)
class Shape extends ElementProperites {
//!Shape Strok Color
@HiveField(7)
Color _shapeStrokColor = Colors.red;
Color get shapeStrokColor => _shapeStrokColor;
set setShapeStrokColor(Color value) => _shapeStrokColor = value;
//!Shape Color
@HiveField(8)
Color _shapeColor = Colors.red;
Color get shapeColor => _shapeColor;
set setShapeColor(Color value) => _shapeColor = value;
//!Shape Strok width
@HiveField(9)
double _shapeWidthColor = 5.0;
double get shapeWidthColor => _shapeWidthColor;
set setShapeWidthColor(double value) => _shapeWidthColor = value;
@override
void saveElement({required var object}) {}
@override
Future initHiveBox({required String hiveBoxName}) async =>
await Hive.openBox(hiveBoxName);
}

现在,当我试图用hive保存shape类时,抽象类的字段没有显示在shape.g.dart中如何保存抽象类的字段

现在可能已经很晚了,但对于任何来这里寻找答案的人,我会添加这个答案。现在试试吧,继承有效。这是我的示例代码:-

实体类:-

abstract class Entity extends HiveObject {
@HiveField(0)
int? id;
Entity({this.id});
}

从Entity类继承的类:-

part 'tag.g.dart';
@HiveType(typeId: 0)
@JsonSerializable()
class Tag extends Entity {
@HiveField(1)
String text;
Tag({
super.id,
required this.text,
});
factory Tag.fromJson(Map<String, dynamic> json) => _$TagFromJson(json);
Map<String, dynamic> toJson() => _$TagToJson(this);
}

这是构建runner生成的适配器:-

// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'tag.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class TagAdapter extends TypeAdapter<Tag> {
@override
final int typeId = 0;
@override
Tag read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return Tag(
id: fields[0] as int?,
text: fields[1] as String,
);
}
@override
void write(BinaryWriter writer, Tag obj) {
writer
..writeByte(2)
..writeByte(1)
..write(obj.text)
..writeByte(0)
..write(obj.id);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is TagAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Tag _$TagFromJson(Map<String, dynamic> json) => Tag(
id: json['id'] as int?,
text: json['text'] as String,
);
Map<String, dynamic> _$TagToJson(Tag instance) => <String, dynamic>{
'id': instance.id,
'text': instance.text,
};

请注意,基类和派生类中的字段索引应该不同。我还添加了JsonSerializable,以表明两者可以协同工作,并且在大多数情况下通常需要JSON。

最新更新