1.介绍
1.1 Hive
- 定位: Flutter 下的一个高性能、轻量级、纯Dart实现的NoSQL本地数据库。
-
特点:
- 无需原生依赖,支持 Flutter Web 、移动端和桌面端。
- 数据 存储结构是键值对(key-value), 但支持复杂数据结构(对象、列表、Map)。
- 支持类型适配 (TypeAdapter)把自定义对象存储到本地。
- 速度很快(在 Flutter中 经常比 sqflite 块,因为是内存映射文件 + 二进制序列 化)。
-
底层原理 :
- 文件存储: 数据会以二进制形式存储在一个本地文件中。
- 访问时会一次性加载到内存,操作内存后再写入磁盘(高性能).
- 数据变更可监听(Stream/Box watch).
1.2 shared_preferences
定位:Flutter 提供的官方插件,用来保存简单的持久化数据(例如设置、登录状态等)。
-
特点:
- 存储数据为键值对(key-value)。
- 支持数据类型:int、double、bool、String、List<String>。
- 本质是一个轻量级的偏好存储,适合小数据。
-
底层原理:
- Android 端使用 SharedPreferences(XML 存储)。
- iOS 端使用 NSUserDefaults(plist 存储)。
- 数据写入是异步落盘,读取会从内存中直接取缓存。
2.主要区别
对比点 | Hive | shared_preferences |
---|---|---|
数据类型 | 支持任何类型(需适配器) | 仅支持基础类型和 List<String>
|
性能 | 非常快(内存映射+二进制) | 一般(受限于原生存储实现) |
是否支持复杂对象 | 支持(TypeAdapter) | 不支持 |
数据体积 | 适合较大数据(甚至MB级别) | 适合KB级小数据 |
依赖原生 | 无 | 有(Android/iOS原生API) |
跨平台 | 全平台(Web、Desktop、Mobile) | 主要是 Mobile/Web |
监听能力 | 支持数据变化监听 | 不支持 |
典型场景 | 缓存列表、离线数据、消息记录 | 配置项、token、是否首次登录 |
一句话总结
Hive:本地数据库级别的存储,适合大量数据 + 复杂结构。
shared_preferences:配置/状态类小数据存储。
3.安装和初始化
3.1 Hive安装
dependencies:
hive: ^2.2.3
hive_flutter: ^1.1.0
dev_dependencies:
hive_generator: ^1.1.3
build_runner: ^2.1.7
初始化(通常放在 main):
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter(); // 初始化Hive
runApp(MyApp());
}
3.2 shared_preferences 安装
dependencies:
shared_preferences: ^2.2.0
使用无需额外初始化
4. 使用示例
4.1 Hive 基础用法
存取简单数据
var box = await Hive.openBox('myBox');
// 写数据
await box.put('name', '小明');
await box.put('age', 18);
// 读数据
print(box.get('name')); // 小明
print(box.get('age')); // 18
// 删除
await box.delete('name');
存储对象(需要 typeAdapter)
import 'package:hive/hive.dart';
part 'person.g.dart'; // 自动生成文件
@HiveType(typeId: 0)
class Person {
@HiveField(0)
String name;
@HiveField(1)
int age;
Person(this.name, this.age);
}
// 生成适配器
// flutter packages pub run build_runner build
使用:
Hive.registerAdapter(PersonAdapter());
var box = await Hive.openBox<Person>('personBox');
await box.put('p1', Person('小红', 20));
Person? p = box.get('p1');
print(p?.name); // 小红
监听数据变化
box.watch(key: 'name').listen((event) {
print('name changed to: ${event.value}');
});
4.2 shared_preferences 基础用法
import 'package:shared_preferences/shared_preferences.dart';
// 存
final prefs = await SharedPreferences.getInstance();
await prefs.setString('name', '小明');
await prefs.setInt('age', 18);
await prefs.setBool('isLogin', true);
// 取
String? name = prefs.getString('name');
int? age = prefs.getInt('age');
bool? isLogin = prefs.getBool('isLogin');
// 删
await prefs.remove('name');
5. 使用场景建议
场景 | 推荐 |
---|---|
保存用户登录 token | shared_preferences |
保存用户偏好设置(深色模式开关) | shared_preferences |
缓存接口返回的大量列表数据 | Hive |
离线存储聊天记录、笔记 | Hive |
存储一个复杂对象(类、嵌套数据) | Hive |