第一章 本地存储体系架构
Flutter的本地存储系统分为三个核心层级:
1.1 文件存储层:
• 临时目录:存放可清除的缓存数据(通过getTemporaryDirectory()获取路径)
• 文档目录:存放重要持久化数据(通过getApplicationDocumentsDirectory()获取路径)
1.2 键值存储层:
• SharedPreferences:轻量级键值对存储,支持int/String/bool等基础类型
1.3 数据库层:
• Sqflite:基于SQLite的关系型数据库,适用于复杂数据结构
// 获取文档目录路径示例
Future<File> get _localFile async {
final directory = await getApplicationDocumentsDirectory();
return File('${directory.path}/data.txt');
}第二章 文件存储深度解析
2.1 基础操作流程
• 写入文件:
Future<void> writeContent(String content) async {
final file = await _localFile;
await file.writeAsString(content);
}• 读取文件:
Future<String> readContent() async {
try {
final file = await _localFile;
return await file.readAsString();
} catch (e) {
print("读取失败: $e");
return "";
}
}2.2 二进制文件处理
// 图片文件保存
Future<void> saveImage(ByteData data) async {
final buffer = data.buffer;
final file = await _localFile;
await file.writeAsBytes(buffer.asUint8List());
}常见问题:
• 路径拼接错误:使用path_provider的join()方法避免跨平台路径问题
• 异步未完成导致空指针:所有操作必须使用await等待完成
• 大文件内存溢出:采用分块读写(openWrite()流式处理)
第三章 SharedPreferences应用实战
3.1 基础API使用
// 存储数据
Future<void> saveCount(int value) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setInt('counter', value);
}
// 读取数据
Future<int> loadCount() async {
final prefs = await SharedPreferences.getInstance();
return prefs.getInt('counter') ?? 0;
}3.2 封装工具类
class SPStorage {
static Future<void> set(String key, dynamic value) async {
final prefs = await SharedPreferences.getInstance();
if (value is int) {
await prefs.setInt(key, value);
} else if (value is String) {
await prefs.setString(key, value);
} // 其他类型处理...
}
static Future<dynamic> get(String key) async {
final prefs = await SharedPreferences.getInstance();
return prefs.get(key);
}
}常见问题:
• 类型不匹配:get方法需显式指定类型(如getString())
• 异步未处理导致数据不同步:必须使用await确保写入完成
• 存储容量限制:单条数据不宜超过1MB(建议改用数据库)
第四章 Sqflite数据库进阶
4.1 数据库初始化
Future<Database> initDB() async {
return openDatabase(
join(await getDatabasesPath(), 'app.db'),
onCreate: (db, version) {
db.execute('''
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER
)
''');
},
version: 1,
);
}4.2 CRUD操作
// 插入数据
Future<void> insertUser(User user) async {
final db = await database;
await db.insert('users', user.toMap());
}
// 查询数据
Future<List<User>> getUsers() async {
final db = await database;
final maps = await db.query('users');
return List.generate(maps.length, (i) => User.fromMap(maps[i]));
}4.3 事务处理
Future<void> batchUpdate() async {
final db = await database;
await db.transaction((txn) async {
await txn.update('users', {'age': 30}, where: 'age < ?', whereArgs: [30]);
await txn.delete('orders', where: 'status = ?', whereArgs: ['expired']);
});
}常见问题:
• 数据库锁死:确保每个操作完成后关闭数据库连接
• 版本升级失败:使用onUpgrade处理表结构变更
• Web平台不兼容:Flutter Web需使用shared_preferences_web或IndexedDB替代
第五章 企业级存储方案设计
5.1 混合存储策略
• 高频小数据:SharedPreferences(如用户设置)
• 结构化数据:Sqflite(如订单记录)
• 大文件资源:文件存储(如用户上传的图片)
5.2 数据加密方案
// 使用flutter_secure_storage加密敏感数据
const storage = FlutterSecureStorage();
await storage.write(key: 'token', value: 'encrypted_data');
String token = await storage.read(key: 'token');5.3 云同步机制
// 结合Firebase实现跨设备同步
FirebaseFirestore.instance
.collection('users')
.doc(userId)
.snapshots()
.listen((snapshot) {
_updateLocalDB(snapshot.data());
});第六章 高频问题解决方案
6.1 数据丢失问题
• 现象:应用重启后数据未保存
• 解决方案:
- 检查异步操作是否使用
await - 通过
WidgetsBindingObserver监听应用生命周期自动保存
6.2 跨平台兼容性问题
• Flutter Web适配:
• 使用shared_preferences_web替代Sqflite
• 大型数据改用IndexedDB(通过idb库)
6.3 性能优化策略
• 数据库索引优化:
CREATE INDEX user_name_idx ON users(name);• 文件缓存淘汰:采用LRU算法定期清理临时目录
• 批量写入优化:使用事务处理替代多次单条操作
















