Флаттер: поля объекта, добавленного в поле улья, возвращают значение null после перезапуска приложения

#android #flutter #object #mobile #flutter-hive

Вопрос:

Я создаю приложение с помощью Flutter и Hive, но я еще не знаком с ним.
мне нужна начальная учетная запись в нем, поэтому я создал для этого поле Hive и пытаюсь сохранить объект учетной записи в этом поле.
Я проверяю добавление с помощью отпечатков, и он правильно сохранил объект в поле. Но когда я перезапускаю приложение, печать больше не возвращает значения. Объект все еще там, но только поле имени строки имеет значение, а два других-значения null.
Почему некоторые поля становятся пустыми после перезапуска?

Вывод после первого запуска

 I/flutter (14014): wallet
I/flutter (14014): Currencies.USD
I/flutter (14014): 0.0
 

Вывод после перезапуска

 I/flutter (14014): wallet
I/flutter (14014): null
I/flutter (14014): null
 

Основной код

 void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  Directory document = await getApplicationDocumentsDirectory();

  Hive.registerAdapter(CurrenciesAdapter());
  Hive.registerAdapter(AccountAdapter());
  Hive.init(document.path);

  final accountBox = await Hive.openBox<Account>('accounts');

  if (accountBox.length == 0) { // default wallet
    Account wallet = new Account("wallet", Currencies.USD);
    accountBox.add(wallet);
  }

  print(accountBox.getAt(0).name.toString());
  print(accountBox.getAt(0).currency.toString());
  print(accountBox.getAt(0).cashAmount.toString());

  runApp(MyApp());
}
 

Код класса учетной записи

 import 'package:hive/hive.dart';

part 'account.g.dart';

@HiveType(typeId: 0)
class Account {
  @HiveField(0)
  String name;
  @HiveField(1)
  Currencies currency;
  @HiveField(2)
  double cashAmount;

  Account(String name, Currencies currency){
    this.name = name;
    this.currency = currency;
    this.cashAmount = 0;
  }
}

@HiveType(typeId: 1)
enum Currencies {
  USD, EUR, PLN
}

 

Комментарии:

1. Проблема была решена. Я использовал свой собственный тип перечисления валют и создал неправильный тип улья. Недостаточно написать это так, как в приведенном выше коде. Каждое отдельное перечисление должно иметь свое собственное @HiveField(индекс). После добавления этого все данные теперь загружаются правильно после перезапуска приложения. Вот пример: codegrepper.com/code-examples/dart/flutter улей перечисление

Ответ №1:

Я только что столкнулся с той же проблемой, когда добавил новое поле в класс, к которому я не прикасался в течение очень долгого времени. Оказалось, я забыл обновить модель с помощью:

 flutter pub run build_runner build