Flutter 本地存储
shared_preferences 是 Flutter 里最常用的本地轻量存储库,相当于移动端的“本地小数据存储”。适合保存简单的小型键值对数据。
我用你喜欢的简单易懂方式来解释。
📌 shared_preferences 是什么?
它就像一个小型本地数据库(Key → Value),适合存:
- 登录状态(isLogin = true/false)
- token
- 用户名 / 用户设置
- 主题模式(dark / light)
- 新手引导是否已完成
不适合存:
- 大文件
- 大量 JSON
- 图片、二进制数据
📦 如何使用(最常用方式)
1. 安装依赖(pubspec.yaml)
yaml
dependencies:
shared_preferences: ^2.3.22. 导入
dart
import 'package:shared_preferences/shared_preferences.dart';3. 保存数据(写)
dart
final prefs = await SharedPreferences.getInstance();
prefs.setString('token', 'abc123');
prefs.setBool('isLogin', true);
prefs.setInt('age', 18);4. 读取数据(读)
dart
final prefs = await SharedPreferences.getInstance();
String? token = prefs.getString('token');
bool isLogin = prefs.getBool('isLogin') ?? false;
int? age = prefs.getInt('age');❓ 常见疑问(我提前帮你回答)
1. 📌 为什么读取是异步?
因为数据存到设备本地文件,需要读取 I/O,不是内存操作,所以是 await。
2. 📌 和本地数据库(sqflite)区别?
| shared_preferences | sqflite |
|---|---|
| 存键值对小数据 | 存大量结构化数据 |
| 轻量 | 重量 |
| 简单 | 复杂 |
| 配置类数据 | 用户数据、表格数据 |
3. 📌 支持哪些类型?
- String
- int
- double
- bool
- List<String>
不支持 Map 或对象。
如果要存对象 → jsonEncode 自己转成字符串。
💡 存对象示例
dart
final prefs = await SharedPreferences.getInstance();
final userJson = jsonEncode({
"name": "Tom",
"age": 20
});
prefs.setString('user', userJson);读取:
dart
final prefs = await SharedPreferences.getInstance();
final user = jsonDecode(prefs.getString('user')!);
print(user['name']);