1.介紹
1.1 Hive
- 定位: Flutter 下的一個高性能、輕量級、純Dart實現(xiàn)的NoSQL本地數(shù)據(jù)庫。
-
特點:
- 無需原生依賴,支持 Flutter Web 、移動端和桌面端。
- 數(shù)據(jù) 存儲結(jié)構(gòu)是鍵值對(key-value), 但支持復雜數(shù)據(jù)結(jié)構(gòu)(對象、列表、Map)。
- 支持類型適配 (TypeAdapter)把自定義對象存儲到本地。
- 速度很快(在 Flutter中 經(jīng)常比 sqflite 塊,因為是內(nèi)存映射文件 + 二進制序列 化)。
-
底層原理 :
- 文件存儲: 數(shù)據(jù)會以二進制形式存儲在一個本地文件中。
- 訪問時會一次性加載到內(nèi)存,操作內(nèi)存后再寫入磁盤(高性能).
- 數(shù)據(jù)變更可監(jiān)聽(Stream/Box watch).
1.2 shared_preferences
定位:Flutter 提供的官方插件,用來保存簡單的持久化數(shù)據(jù)(例如設(shè)置、登錄狀態(tài)等)。
-
特點:
- 存儲數(shù)據(jù)為鍵值對(key-value)。
- 支持數(shù)據(jù)類型:int、double、bool、String、List<String>。
- 本質(zhì)是一個輕量級的偏好存儲,適合小數(shù)據(jù)。
-
底層原理:
- Android 端使用 SharedPreferences(XML 存儲)。
- iOS 端使用 NSUserDefaults(plist 存儲)。
- 數(shù)據(jù)寫入是異步落盤,讀取會從內(nèi)存中直接取緩存。
2.主要區(qū)別
| 對比點 | Hive | shared_preferences |
|---|---|---|
| 數(shù)據(jù)類型 | 支持任何類型(需適配器) | 僅支持基礎(chǔ)類型和 List<String>
|
| 性能 | 非??欤▋?nèi)存映射+二進制) | 一般(受限于原生存儲實現(xiàn)) |
| 是否支持復雜對象 | 支持(TypeAdapter) | 不支持 |
| 數(shù)據(jù)體積 | 適合較大數(shù)據(jù)(甚至MB級別) | 適合KB級小數(shù)據(jù) |
| 依賴原生 | 無 | 有(Android/iOS原生API) |
| 跨平臺 | 全平臺(Web、Desktop、Mobile) | 主要是 Mobile/Web |
| 監(jiān)聽能力 | 支持數(shù)據(jù)變化監(jiān)聽 | 不支持 |
| 典型場景 | 緩存列表、離線數(shù)據(jù)、消息記錄 | 配置項、token、是否首次登錄 |
一句話總結(jié)
Hive:本地數(shù)據(jù)庫級別的存儲,適合大量數(shù)據(jù) + 復雜結(jié)構(gòu)。
shared_preferences:配置/狀態(tài)類小數(shù)據(jù)存儲。
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 基礎(chǔ)用法
存取簡單數(shù)據(jù)
var box = await Hive.openBox('myBox');
// 寫數(shù)據(jù)
await box.put('name', '小明');
await box.put('age', 18);
// 讀數(shù)據(jù)
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); // 小紅
監(jiān)聽數(shù)據(jù)變化
box.watch(key: 'name').listen((event) {
print('name changed to: ${event.value}');
});
4.2 shared_preferences 基礎(chǔ)用法
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 |
| 保存用戶偏好設(shè)置(深色模式開關(guān)) | shared_preferences |
| 緩存接口返回的大量列表數(shù)據(jù) | Hive |
| 離線存儲聊天記錄、筆記 | Hive |
| 存儲一個復雜對象(類、嵌套數(shù)據(jù)) | Hive |