解析 Flutter 原理:数据持久化的底层实现方式
Web 平台依赖浏览器存储(IndexedDB/LocalStorage),实现逻辑与其他平台有差异,需测试兼容性。私有沙盒目录中(如 Android 的。轻量级,适用于简单配置数据,但。
·
Flutter 数据持久化的底层实现主要依赖平台原生能力与 Dart 层的桥接封装,核心方式如下:
1. 键值对存储(如 shared_preferences)
底层原理:
- Android 端:通过
MethodChannel调用 Java/Kotlin 的SharedPreferencesAPI,数据以 XML 文件存储于: $$ \text{/data/data/<package_name>/shared_prefs/<file_name>.xml} $$ - iOS 端:通过
PlatformChannel调用 Objective-C/Swift 的NSUserDefaults,数据存储在沙盒的: $$ \text{~/Library/Preferences/<bundle_id>.plist} $$
特点:
轻量级,适用于简单配置数据,但不适合存储敏感信息(未加密)。
2. 文件存储(如 path_provider + dart:io)
底层路径封装:
| 数据类型 | Android 路径 | iOS 路径 |
|---|---|---|
| 临时文件 | getCacheDir() |
NSTemporaryDirectory() |
| 应用私有文件 | getFilesDir() |
NSDocumentDirectory |
| 外部存储 | getExternalStorageDirectory() |
无直接对应,需权限请求 |
文件操作:
final file = File('${(await getApplicationDocumentsDirectory()).path}/data.txt');
await file.writeAsString('Hello Flutter'); // 写入
String content = await file.readAsString(); // 读取
3. SQLite 数据库(如 sqflite)
底层实现:
- Android:集成
sqlite3C 库,通过 JNI 调用 - iOS:直接使用系统级
SQLite.framework - Dart 层:
sqflite插件封装原生 SQLite API,提供事务支持:await db.transaction((txn) async { await txn.rawInsert('INSERT INTO User(name) VALUES(?)', ['Alice']); });
存储位置:
私有沙盒目录中(如 Android 的 /data/data/<package>/databases/)。
4. 对象存储(如 hive)
创新设计:
- 使用纯 Dart 实现,无平台通道开销
- 数据以二进制格式存储(扩展名
.hive) - 基于 Key-Value 的 LSM 树结构,支持零拷贝反序列化
- 加密示例:
final encryptionKey = Hive.generateSecureKey(); final box = await Hive.openBox('secureBox', encryptionCipher: HiveAesCipher(encryptionKey));
跨平台实现架构
graph TD
A[Dart 层] -->|调用| B[Plugin 接口]
B -->|平台通道| C{原生平台}
C -->|Android| D[Java/Kotlin + SQLite/SharedPreferences]
C -->|iOS| E[Swift/Obj-C + CoreData/SQLite/NSUserDefaults]
C -->|Web| F[IndexedDB/LocalStorage]
关键考量点
- 性能优先级:
- 高频读写选 Hive(无序列化开销)
- 复杂查询用 SQLite
- 安全性:
敏感数据需结合flutter_secure_storage(Android 用 Keystore,iOS 用 Keychain) - 数据量:
- 小数据:键值对(
shared_preferences) - 大数据:文件或数据库
- 小数据:键值对(
注意:Web 平台依赖浏览器存储(IndexedDB/LocalStorage),实现逻辑与其他平台有差异,需测试兼容性。
更多推荐
所有评论(0)