#flutter #dart #flutter-hive
Вопрос:
После создания модели для установления связи между 2 моделями я не могу получить данные полей из вложенных отношений
У меня есть модель пользователя , которая содержит другую модель в виде транзакций, которая является HiveList
, теперь, когда я пытаюсь получить поле, например, cost
из транзакции с кодом ниже:
final Box<User> _user = Hive.box<User>('user');
print('${_user.values.first.transactions.first.cost}');
я получаю эту ошибку:
ошибка: Получатель «стоимость» не определен для типа «HiveObjectMixin». (неопределенный параметр в [xxxx] lib/src/экраны/панель мониторинга/вкладки/screen_transactions.dart:85)
Модели:
@HiveType(typeId: 1)
class User extends HiveObject {
@HiveField(0)
late String nameFamily;
@HiveField(1)
late String apiToken;
@HiveField(2)
late String mobileNumber;
@HiveField(3)
late HiveList transactions;
}
@HiveType (typeId: 4)
class Transactions extends HiveObject {
@HiveField(0)
late int cost;
@HiveField(1)
late int type;
@HiveField(2)
late String dateTime;
}
Адаптеры:
class UserAdapter extends TypeAdapter<User> {
@override
final int typeId = 1;
@override
User read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i ) reader.readByte(): reader.read(),
};
return User()
..nameFamily = fields[0] as String
..apiToken = fields[1] as String
..mobileNumber = fields[2] as String
..transactions = (fields[5] as HiveList).castHiveList();
}
@override
void write(BinaryWriter writer, User obj) {
writer
..writeByte(6)
..writeByte(0)
..write(obj.nameFamily)
..writeByte(1)
..write(obj.apiToken)
..writeByte(2)
..write(obj.mobileNumber)
..writeByte(3)
..write(obj.transactions);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is UserAdapter amp;amp;
runtimeType == other.runtimeType amp;amp;
typeId == other.typeId;
}
class WalletAdapter extends TypeAdapter<Wallet> {
@override
final int typeId = 3;
@override
Wallet read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i ) reader.readByte(): reader.read(),
};
return Wallet()..total = fields[0] as int;
}
@override
void write(BinaryWriter writer, Wallet obj) {
writer
..writeByte(1)
..writeByte(0)
..write(obj.total);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is WalletAdapter amp;amp;
runtimeType == other.runtimeType amp;amp;
typeId == other.typeId;
}
Ответ №1:
Я решил эту проблему cast()
методом для какого класса , который я должен использовать в качестве List
, например:
_user.values.first.transactions.cast().cost