在蜂巢中保存继承类-Flutter

发布于 2025-01-18 00:26:41 字数 2663 浏览 2 评论 0原文

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

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

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.g.dart 中 我如何保存抽象类的字段

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

温馨耳语 2025-01-25 00:26:41

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

实体类: -

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

  Entity({this.id});
}

从实体类继承的类: -

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);
}

这是构建跑步者生成的适配器: -

// 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,
    };

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

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文