Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

save inherit class in Hive - Flutter

Tags:

flutter

dart

hive

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

like image 354
Anas-Qasem Avatar asked Nov 19 '25 21:11

Anas-Qasem


1 Answers

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.

like image 160
Pankaj Agarwal Avatar answered Nov 21 '25 21:11

Pankaj Agarwal



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!