Flutter 本地存儲 Hive & shared_preferences

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容