Flutter 本地存储 Hive & shared_preferences

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容