我正在嘗試存盤具有變數存盤串列的自定義物件XFile;來自名為image_pickerversion 的包的跨平臺影像表示0.8.4 3。當撰寫一個錯誤時,說我缺少配接器XFile這是可以理解的,但我很難決定如何為外部源檔案類宣告這樣的配接器。
這是我的Receipt班級,有一些XFile's串列。
注意:我已經從代碼片段中洗掉了無意義的變數。
@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, addHiveType和HiveField裝飾器復制整個源代碼并從中生成配接器 - 創建將從 XFile 擴展的類并添加如下裝飾器:
@HiveType(typeId: 1)
class XFileAdapter extends XFile with HiveObjectMixin {
// access fields and add decorators here
}
但我不知道如何在不覆寫每個欄位的情況下向這些欄位添加裝飾器。即使我知道怎么做,事實證明XFile's 沒有自己的變數,我可以將 Hive 裝飾器添加到其中,它只需要引數并將它們傳遞給XFileBase類,因為它進一步決定要做什么他們。
在這個執行緒中已經提出了非常相似的問題,但唯一的答案是從頭開始創建新類來模仿源類,這不是我的問題的解決方案。
uj5u.com熱心網友回復:
我認為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<XFile>? files你的Receipt類,你將需要List<MyXFile>? files。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/339519.html
上一篇:填充從哪里來?
