Flutter 数据持久化的底层实现主要依赖平台原生能力与 Dart 层的桥接封装,核心方式如下:

1. 键值对存储(如 shared_preferences

底层原理:

  • Android 端:通过 MethodChannel 调用 Java/Kotlin 的 SharedPreferences API,数据以 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:集成 sqlite3 C 库,通过 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]

关键考量点

  1. 性能优先级
    • 高频读写选 Hive(无序列化开销)
    • 复杂查询用 SQLite
  2. 安全性
    敏感数据需结合 flutter_secure_storage(Android 用 Keystore,iOS 用 Keychain)
  3. 数据量
    • 小数据:键值对(shared_preferences
    • 大数据:文件或数据库

注意:Web 平台依赖浏览器存储(IndexedDB/LocalStorage),实现逻辑与其他平台有差异,需测试兼容性。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐