Hive 是一个轻量级、高性能的 NoSQL 本地数据库,支持类型安全和快速读写。
- 添加依赖
在 pubspec.yaml 中添加 Hive 和代码生成相关依赖:
dependencies:
flutter:
sdk: flutter
hive: ^2.2.3
hive_flutter: ^1.1.0
dev_dependencies:
hive_generator: ^2.0.0
build_runner: ^2.3.3
运行 flutter pub get 安装依赖。
- 初始化 Hive
在 main.dart 中初始化 Hive,并注册适配器(用于序列化实体类):
import 'package:hive_flutter/hive_flutter.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter();
// 注册实体类的适配器(需提前生成)
Hive.registerAdapter(UserAdapter());
runApp(MyApp());
}
- 创建实体类并生成适配器
实体类示例 (user.dart)
import 'package:hive/hive.dart';
part 'user.g.dart'; // 代码生成文件
@HiveType(typeId: 0)
class User {
@HiveField(0)
final String id;
@HiveField(1)
final String name;
@HiveField(2)
final int age;
User({required this.id, required this.name, required this.age});
}
生成适配器
运行以下命令生成 UserAdapter:
flutter pub run build_runner build
这会生成 user.g.dart,包含 UserAdapter 的实现。
- 封装 Hive 工具类
创建一个通用工具类 HiveHelper.dart,支持任意实体类的存储和操作:
import 'package:hive/hive.dart';
class HiveHelper<T> {
final String boxName;
Box<T>? _box;
HiveHelper({required this.boxName});
// 初始化并打开盒子
Future<void> init() async {
_box = await Hive.openBox<T>(boxName);
}
// 添加或更新数据
Future<void> put(String key, T value) async {
await _box?.put(key, value);
}
// 获取数据
T? get(String key) {
return _box?.get(key);
}
// 删除数据
Future<void> delete(String key) async {
await _box?.delete(key);
}
// 获取全部数据
List<T> getAll() {
return _box?.values.toList() ?? [];
}
// 清空盒子
Future<void> clear() async {
await _box?.clear();
}
// 关闭盒子
Future<void> close() async {
await _box?.close();
}
}
- 使用示例
初始化并存储数据
// 初始化工具类(User 为实体类)
final userHelper = HiveHelper<User>(boxName: 'userBox');
await userHelper.init();
// 存储用户数据
final user = User(id: '1', name: 'Alice', age: 25);
await userHelper.put(user.id, user);
// 获取用户数据
User? savedUser = userHelper.get('1');
print(savedUser?.name); // 输出: Alice
// 获取全部用户
List<User> allUsers = userHelper.getAll();
// 删除用户
await userHelper.delete('1');
- 高级功能
监听数据变化
userHelper._box?.listenable().addListener(() {
print('Box 数据发生变化!');
});
使用 LazyBox(延迟加载)
final lazyBox = await Hive.openLazyBox('lazyBox');
await lazyBox.put('key', heavyData); // 延迟加载数据
加密数据
import 'package:hive/hive.dart';
final encryptionKey = Hive.generateSecureKey();
final encryptedBox = await Hive.openBox(
'encryptedBox',
encryptionCipher: HiveAesCipher(encryptionKey),
);
- 注意事项
类型 ID 唯一性:确保每个实体类的 typeId 唯一,避免冲突。**
适配器注册:必须在 Hive.initFlutter() 后注册适配器。
盒子管理:及时关闭不再使用的盒子以释放资源。
数据迁移:修改实体类字段时,需处理旧数据兼容性(如使用 @HiveField 的 defaultValue)。
通过以上封装,可以高效管理本地数据存储,适用于用户配置、缓存、小型数据集等场景。根据需求扩展工具类功能(如分页查询、批量操作等)。