Налаштування бази даних Hive в Flutter-додатку
Hive — це NoSQL сховище ключ-значення для Flutter, написане чистим Dart без нативних залежностей. Працює на всіх платформах: iOS, Android, Web та Desktop. Головна перевага — швидкість: операції читання значно швидші ніж SQLite для простих об'єктів, оскільки Hive зберігає дані в бінарному форматі та зберігає часто використовувані боксди в пам'яті.
Що ми налаштовуємо
Додайте до pubspec.yaml:
dependencies:
hive: ^2.2.3
hive_flutter: ^1.1.0
dev_dependencies:
hive_generator: ^2.0.1
build_runner: ^2.4.6
Ініціалізуйте у main() перед runApp:
await Hive.initFlutter();
Hive.registerAdapter(UserAdapter());
await Hive.openBox<User>('users');
runApp(const MyApp());
TypeAdapters для користувацьких об'єктів. Hive не може зберігати довільні Dart-класи без адаптера. Анотуйте вашу модель:
@HiveType(typeId: 0)
class User extends HiveObject {
@HiveField(0)
late String id;
@HiveField(1)
late String name;
}
Запустіть генерацію коду: flutter pub run build_runner build. Це генерує user.g.dart з UserAdapter. typeId має бути унікальним у всій програмі. Конфліктуючі значення typeId викликають HiveError при відкритті боксу.
Зашифрований бокс. Для чутливих даних (токени, облікові дані користувача) використовуйте зашифрований бокс. Ключ шифрування генерується через Hive.generateSecureKey() і зберігається в flutter_secure_storage, не в SharedPreferences або самому Hive:
final secureStorage = const FlutterSecureStorage();
var encryptionKey = await secureStorage.read(key: 'hive_key');
if (encryptionKey == null) {
final key = Hive.generateSecureKey();
await secureStorage.write(key: 'hive_key', value: base64Url.encode(key));
encryptionKey = base64Url.encode(key);
}
final encryptedBox = await Hive.openBox('secureBox',
encryptionCipher: HiveAesCipher(base64Url.decode(encryptionKey)));
Поширені помилки
Відкриття боксу декілька разів: Hive.openBox для вже відкритого боксу повертає існуючий екземпляр, але виклик Hive.box('name') перед відкриттям викликає HiveError: Box not found. Рекомендація: відкрийте всі необхідні боксди у main() та звертайтесь до них через Hive.box<T>('name') у своєму коді.
Забування закрити боксди при завершенні: викличте Hive.close() у dispose() або через WidgetsBindingObserver. В production на iOS це може привести до втрати даних, якщо додаток буде примусово закритий.
Часові рамки
Налаштування Hive з базовими CRUD-операціями і 2–3 моделями: 4–8 годин. З шифруванням і генерацією коду по всьому проекту: 1–2 дні. Вартість розраховується індивідуально.







