Настройка Hive базы данных во Flutter-приложении
Hive — NoSQL key-value хранилище для 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 при открытии бокса.
Encrypted box. Для чувствительных данных (токены, личные данные пользователя) используем зашифрованный бокс. Ключ шифрования генерируется через 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. В продакшене на iOS это может вызвать потерю данных при форс-закрытии приложения.
Сроки
Настройка Hive с базовыми CRUD-операциями и 2–3 моделями: 4–8 часов. С шифрованием и кодогенерацией под весь проект: 1–2 дня. Стоимость рассчитывается индивидуально.







