I'm working on project where you can Add Audio,video and Shapes(like box,circle,triangle,etc..) to specific workspace and you can change the location of all these objects in the workspace
so I made an abstract class that Contains the shared properties between all the objects like offset,type,size etc ...
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});
}
and each one of objects have class extend the abstract class.
for example shape class
@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);
}
now when I tried to save shape class with hive, the fields of abstract class not showing in shape.g.dart how i can save the fields of abstract class
Its probably quite late by now but for anyone coming here searching for an answer I add this answer. Try it now the inheritance works. Here's my sample code:-
The Entity class:-
abstract class Entity extends HiveObject {
@HiveField(0)
int? id;
Entity({this.id});
}
A class that inherits from the Entity class:-
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);
}
And this is the adapter that build runner generated:-
// 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,
};
Please note that field indexes should be different in the base class and the derived class. I have also added JsonSerializable too to show both can work together and JSON is usually required in most situations.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With