在移動應用開發中,本地持久化存儲是必不可少的功能。無論是保存用戶登錄狀態、應用配置,還是緩存數據,合理選擇存儲方案都能提高應用的性能與用戶體驗。
在 Flutter 中,常用的本地存儲方式主要有兩種:SharedPreferences 和 Hive。
本文將帶你快速了解這兩種方式的特點,并通過簡單的 Demo 展示如何使用它們。
🔹 1. SharedPreferences
1.1 簡介
SharedPreferences
是 Flutter 提供的輕量級存儲方式,底層使用 Key-Value 形式存儲,適合存儲少量配置信息。
1.2 使用步驟
添加依賴
# pubspec.yaml
dependencies:shared_preferences: ^2.2.2
示例代碼
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';class SharedPreferencesDemo extends StatefulWidget {@override_SharedPreferencesDemoState createState() => _SharedPreferencesDemoState();
}class _SharedPreferencesDemoState extends State<SharedPreferencesDemo> {String _username = "";Future<void> _saveData() async {final prefs = await SharedPreferences.getInstance();await prefs.setString("username", "FlutterUser");setState(() {_username = "FlutterUser";});}Future<void> _loadData() async {final prefs = await SharedPreferences.getInstance();setState(() {_username = prefs.getString("username") ?? "暫無數據";});}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("SharedPreferences Demo")),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text("用戶名:$_username"),ElevatedButton(onPressed: _saveData,child: Text("保存數據"),),ElevatedButton(onPressed: _loadData,child: Text("讀取數據"),),],),),);}
}
🔹 2. Hive
2.1 簡介
Hive
是 Flutter 社區非常流行的 NoSQL 本地數據庫,支持持久化存儲、加密和復雜數據結構,性能優于 SharedPreferences
。
2.2 使用步驟
添加依賴
# pubspec.yaml
dependencies:hive: ^2.2.3hive_flutter: ^1.1.0# 如果要存儲復雜對象
# dev_dependencies:
# hive_generator: ^2.0.1
# build_runner: ^2.3.3
初始化 Hive
import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';void main() async {WidgetsFlutterBinding.ensureInitialized();await Hive.initFlutter();await Hive.openBox("settings");runApp(MyApp());
}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Hive Demo",home: HiveDemo(),);}
}class HiveDemo extends StatefulWidget {@override_HiveDemoState createState() => _HiveDemoState();
}class _HiveDemoState extends State<HiveDemo> {final box = Hive.box("settings");String _username = "暫無數據"; // 本地存儲的用戶名void _saveData() {box.put("username", "HiveUser");setState(() {_username = "HiveUser"; // 立即更新 UI});}void _loadData() {final value = box.get("username", defaultValue: "暫無數據");setState(() {_username = value;});}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("Hive Demo")),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text("用戶名:$_username"),ElevatedButton(onPressed: _saveData,child: Text("保存數據"),),ElevatedButton(onPressed: _loadData,child: Text("讀取數據"),),],),),);}
}
2.3 封裝 HiveService(存儲數組示例)
在實際項目中,為了方便調用,可以對 Hive 進行二次封裝,例如存儲數組:
import 'package:hive/hive.dart';class HiveService {Future<void> saveArray(String key, List<dynamic> array) async {var box = await Hive.openBox('myBox');await box.put(key, array); // 保存數組}Future<List<dynamic>> getArray(String key) async {var box = await Hive.openBox('myBox');return box.get(key, defaultValue: []); // 獲取數組,默認值為空列表}
}
這樣,我們只需調用 HiveService().saveArray("users", ["張三", "李四"])
即可保存數組,調用 HiveService().getArray("users")
即可獲取,十分方便。
🔹 3. 對比總結
特性 | SharedPreferences | Hive |
---|---|---|
存儲方式 | Key-Value | NoSQL 本地數據庫 |
適用場景 | 配置項、布爾開關、少量數據 | 列表、對象、大量本地數據 |
性能 | 適合輕量存儲 | 高性能,支持大規模數據存儲 |
數據類型 | 基礎類型(String/Int/Bool) | 支持復雜對象和數組 |
易用性 | 簡單易上手 | 初學需要配置,但功能更強大 |
加密支持 | 無 | 支持 AES 加密 |
? 結論:
如果只是存儲登錄狀態或主題設置,用 SharedPreferences 就夠了。
如果需要存儲數組、對象或大量數據,推薦使用 Hive,并可通過封裝服務類提高代碼復用性。