Чтение значения Hivebox возвращает список <dynamic>вместо сохраненного списка <Object> - PullRequest
0 голосов
/ 28 февраля 2020

Я сохраняю список в индексе в поле улья.

class Person { 
 String name;
 Person(this.name);
}

List<Person> friends = [];
friends.add(Person('Jerry'));

var accountBox = Hive.openBox('account');
accountBox.put('friends',friends);

//Testing as soon as saved to make sure it's storing correctly.
List<Person> friends = accountBox.get('friends');
assert(friends.length == 1);

, поэтому все это работает как задумано. По какой-то безумной причине, когда я горячо перезапускаю приложение и пытаюсь получить список друзей из Hive, оно больше не возвращает List<Person>. Возвращает List<dynamic>

var accountBox = Hive.openBox('account');
List<Person> friends = accountBox.get('friends');

///ERROR
E/flutter (31497): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled
Exception: type 'List<dynamic>' is not a subtype of type 'List<Person>'
E/flutter (31497): <asynchronous suspension>
etc...

Что может быть причиной этого? Это так необычно.

1 Ответ

1 голос
/ 28 февраля 2020

Hive - это преимущественно база данных в памяти с файловым кешем. Пока приложение работает, оно, вероятно, хранит объекты, которые вы поместили в него, как есть, в памяти, но сохраняет объекты в файле кэша как сериализованные двоичные данные. Это означает, что пока приложение открыто, вы получите список Person обратно, но он не будет знать, как получить эти данные из файла кэша. В результате Hive делает все возможное, чтобы десериализовать данные и вернуть их вам как dynamic, но без дополнительной информации это столько, сколько можно.

Если вы хотите сохранить ваши данные в целости и сохранности после Приложение закрывается, вам нужно указать Hive, как (де) сериализовать ваш тип. Для этого пометьте свой класс соответствующим образом аннотациями Hive.

@HiveType(typeId: 0)
class Person extends HiveObject { 
  @HiveField(0)
  String name;

  Person(this.name);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...