Skip to content
Wen's Blog

Flutter App 数据持久化的最佳实践

Apr 25, 2025 — Flutter

在移动应用开发中,数据持久化(Data Persistence)指的是将数据安全可靠地存储在设备本地,以便在应用会话之间甚至设备重启后依然可以访问。 在 Flutter 应用中,数据持久化不仅关乎用户体验的连贯性,也直接关系到应用功能的完整性与专业度。

典型场景如:

正确选择持久化方案、合理设计存储结构,是开发高质量 Flutter 应用的基础。本文将系统介绍主流 Flutter 数据持久化技术及最佳实践,助您在项目中灵活应用、精准落地。

数据持久化方案概览

根据数据特性和存储需求不同,Flutter 中的数据持久化大致可分为以下几类:

分类典型用途常用技术
键值对存储配置项、小量状态保存shared_preferenceshive
关系型数据库复杂结构化数据、关联查询sqflitedriftfloor
安全存储敏感信息(如密码、令牌)flutter_secure_storage
文件存储大型非结构化数据(如图片、缓存)dart:io + path_provider
高性能对象数据库离线缓存、大数据量、复杂嵌套结构isarobjectboxrealmsembast

常见的持久化方案

1. Key-Value 存储

SharedPreferences —— 简单配置存储

适合场景:

示例代码:

import 'package:shared_preferences/shared_preferences.dart';
Future<void> saveThemePreference(String theme) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setString('appTheme', theme);
}
Future<String?> readThemePreference() async {
final prefs = await SharedPreferences.getInstance();
return prefs.getString('appTheme');
}

优缺点总结:


Hive —— 高性能本地 NoSQL

适合场景:

基本使用:

import 'package:hive/hive.dart';
Future<void> saveThemeHive() async {
var box = await Hive.openBox('settings');
await box.put('theme', 'dark');
}
Future<String?> readThemeHive() async {
var box = await Hive.openBox('settings');
return box.get('theme');
}

存储自定义对象:(需要注册 TypeAdapter)

@HiveType(typeId: 0)
class User extends HiveObject {
@HiveField(0)
final String name;
@HiveField(1)
final int age;
User(this.name, this.age);
}

优缺点总结:

2. 关系型数据库(SQL)

sqflite —— 原生 SQLite 操作

适合场景:

建表与插入示例:

import 'package:sqflite/sqflite.dart';
final Database db = await openDatabase('my_db.db', version: 1,
onCreate: (db, version) {
return db.execute(
'CREATE TABLE tasks(id INTEGER PRIMARY KEY, title TEXT, completed INTEGER)',
);
},
);
Future<void> insertTask(String title) async {
await db.insert('tasks', {'title': title, 'completed': 0});
}

优缺点总结:

Drift —— 类型安全 + 响应式 SQLite 封装

适合场景:

简易示例:

@DriftDatabase(tables: [Todos])
class AppDatabase extends _$AppDatabase {
AppDatabase() : super(NativeDatabase.memory());
@override
int get schemaVersion => 1;
}
@DataClassName('Todo')
class Todos extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get content => text()();
}

3. 安全存储(加密)

flutter_secure_storage —— 安全保存敏感信息

适合场景:

使用示例:

import 'package:flutter_secure_storage/flutter_secure_storage.dart';
final storage = FlutterSecureStorage();
Future<void> saveToken(String token) async {
await storage.write(key: 'auth_token', value: token);
}
Future<String?> readToken() async {
return await storage.read(key: 'auth_token');
}

优缺点总结:

4. 文件存储

适合场景:

读写示例:

import 'dart:io';
import 'package:path_provider/path_provider.dart';
Future<void> writeFile(String fileName, String content) async {
final dir = await getApplicationDocumentsDirectory();
final file = File('${dir.path}/$fileName');
await file.writeAsString(content);
}
Future<String> readFile(String fileName) async {
final dir = await getApplicationDocumentsDirectory();
final file = File('${dir.path}/$fileName');
return await file.readAsString();
}

5. 高性能对象数据库(新兴趋势)

Isar —— 超高性能嵌入式数据库

特点:

其他方案

如何选择持久化方案?

场景推荐方案
简单配置项shared_preferences
简单对象缓存hive
复杂关联数据(需要 SQL 查询)sqflite / drift / floor
敏感信息存储flutter_secure_storage
大型文件存储path_provider + dart:io 文件操作
大规模数据、高并发isar / objectbox

实际项目数据持久化架构示例

以中大型 Flutter 应用为例,推荐以下存储层架构设计:

架构图概览

[Data Repository]
[Local Storage Abstraction Layer]
[Storage Engine: (Hive/Isar/sqflite)]

关键分层

  1. Repository 层(业务逻辑接口)

    • 暴露统一 API,如 saveUserProfile(User user)loadUserProfile()
    • 屏蔽存储实现细节。
  2. Storage Abstraction 层(存储接口)

    • 定义抽象存储接口 StorageService
    • 支持灵活切换后端(Hive、Isar、Sqflite 等)。
  3. 具体存储实现层(Storage Engine)

    • 基于选定技术(如 Hive、Isar、Sqflite)实现持久化逻辑。
    • 封装底层 API,统一错误处理和日志记录。

示例接口设计

abstract class StorageService {
Future<void> save<T>(String key, T value);
Future<T?> read<T>(String key);
Future<void> delete(String key);
}
class HiveStorageService implements StorageService {
@override
Future<void> save<T>(String key, T value) async {
final box = await Hive.openBox('defaultBox');
await box.put(key, value);
}
@override
Future<T?> read<T>(String key) async {
final box = await Hive.openBox('defaultBox');
return box.get(key) as T?;
}
@override
Future<void> delete(String key) async {
final box = await Hive.openBox('defaultBox');
await box.delete(key);
}
}

通过这种分层设计,应用能轻松切换底层存储方案,并保持业务代码的稳定性和可维护性。

最佳实践总结

未来展望

未来,Flutter 数据持久化方向将呈现如下趋势:

开发者应持续学习并在项目中灵活运用,以应对不断变化的技术挑战。

参考资料

  1. Data Persistence on Flutter - Kodeco (opens in a new window)
  2. Local Data Persistence - Code With Andrea Pro (opens in a new window)
  3. Solving Data Persistence Challenges in Flutter with SQLite - Blup (opens in a new window)
  4. Hive Pros/Cons : r/FlutterDev - Reddit (opens in a new window)
  5. The Pros and Cons of Using Hive Software - ProjectManagers.net (opens in a new window)
  6. Isar Database - Worth it at this point? : r/FlutterDev - Reddit (opens in a new window)
  7. Persistent storage architecture: SQL - Flutter Documentation (opens in a new window)
  8. ObjectBox (opens in a new window)
  9. Isar (opens in a new window)