【问题标题】:How to create Hive adapter for XFile class如何为 XFile 类创建 Hive 适配器
【发布时间】:2021-12-12 17:47:27
【问题描述】:

我正在尝试存储具有XFile 变量存储列表的自定义对象;来自名为image_picker 版本0.8.4+3 的包的跨平台图像表示。写错误时说我缺少 XFile 的适配器,这是可以理解的,但我很难决定如何为外部源文件类声明这样的适配器。

这是我的 Receipt 类,其中包含一些 XFile 的列表。

注意:我已经从 sn-p 中删除了无意义的变量。

@HiveType(typeId: 0)
class Receipt extends HiveObject with EquatableMixin {
  Receipt({
    List<XFile>? files,
  }) {
    this.files = files ?? <XFile>[];
  }

  @HiveField(6)
  late final List<XFile> files;

  @override
  List<Object?> get props => [
        files,
      ];
}

现在我在考虑两种可能的解决方案;一 - 从 XFile 复制整个源代码,添加 HiveTypeHiveField 装饰器并从中生成适配器或两个 - 创建将从 XFile 扩展的类并添加类似这样的装饰器:

@HiveType(typeId: 1)
class XFileAdapter extends XFile with HiveObjectMixin {
    // access fields and add decorators here 
}

但我不知道如何在不覆盖每个字段的情况下向这些字段添加装饰器。即使我知道该怎么做,事实证明 XFile 没有自己的变量,我可以添加 Hive 装饰器,它只需要参数并将它们传递给 XFileBase 类,因为它进一步决定如何处理它们。

in this thread 提出了非常相似的问题,但唯一的建议是从头开始创建模仿源类的新类,这不能解决我的问题。

【问题讨论】:

    标签: flutter imagepicker flutter-hive


    【解决方案1】:

    我认为按照您的建议创建一个新的 MyXFile 类可能是可行的方法。但是正如您所说,您需要覆盖要保留在配置单元中的属性。此代码似乎按预期工作:

    代码

    import 'dart:typed_data';
    
    import 'package:image_picker/image_picker.dart';
    import 'package:hive_flutter/adapters.dart';
    
    part 'my_xfile.g.dart';
    
    @HiveType(typeId: 1)
    class MyXFile extends XFile {
      @override
      @HiveField(1)
      final String path;
    
      @override
      @HiveField(2)
      final String? mimeType;
    
      @HiveField(3)
      final String? _name;
    
      /// The base implementation of `XFileBase.name` throws an
      /// [UnimplementedError] so we are overriding it to return a known
      /// [_name] value.
      @override
      String get name {
        if (_name != null) {
          return _name!;
        }
        return super.name;
      }
    
      @HiveField(4)
      final int? _length;
    
      /// The base implementation of `XFileBase.length()` throws an
      /// [UnimplementedError] so we are overriding it to return a known
      /// [_length] value.
      @override
      Future<int> length() {
        return _length != null ? Future.value(_length!) : super.length();
      }
    
      @HiveField(5)
      final Uint8List? bytes;
    
      @HiveField(6)
      final DateTime? _lastModified;
    
      /// The base implementation of `XFileBase.lastModified()` throws an
      /// [UnimplementedError] so we are overriding it to return a known
      /// [_lastModified] value.
      @override
      Future<DateTime> lastModified() {
        return _lastModified != null
            ? Future.value(_lastModified!)
            : super.lastModified();
      }
    
      MyXFile(
        this.path, {
        this.mimeType,
        String? name,
        int? length,
        this.bytes,
        DateTime? lastModified,
      })  : _name = name,
            _length = length,
            _lastModified = lastModified,
            super(
              path,
              mimeType: mimeType,
              name: name,
              length: length,
              bytes: bytes,
              lastModified: lastModified,
            );
    }
    

    通过使用它,我已经能够保存和检索我的对象MyXFile,并且由于它正在扩展XFile,您应该能够以相同的方式使用它。

    那么,您将需要一个List&lt;MyXFile&gt;? files,而不是在您的Receipt 类中使用List&lt;XFile&gt;? files

    【讨论】:

    • 太棒了,经过一些小改动后就像一个魅力。在复制粘贴之前,我尝试自己做同样的事情,但即使我已经看到抛出异常,我也不知道我可以像你一样简单地覆盖它们,非常感谢。
    猜你喜欢
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多