Flutter 本地存储
本节将介绍 Flutter 中的本地存储方案,包括 SharedPreferences、文件存储和 SQLite 数据库。
SharedPreferences - 轻量级存储
SharedPreferences 适合存储简单的键值对数据。
添加依赖
dependencies: shared_preferences: ^2.0.0
实例:SharedPreferences 使用
import 'package:shared_preferences/shared_preferences.dart';
// 保存数据
Future<void> saveData() async {
final prefs = await SharedPreferences.getInstance();
// 保存字符串
await prefs.setString('username', '张三');
// 保存整数
await prefs.setInt('age', 25);
// 保存布尔值
await prefs.setBool('isLoggedIn', true);
// 保存列表(JSON 字符串)
await prefs.setStringList('tags', ['flutter', 'dart']);
}
// 读取数据
Future<void> loadData() async {
final prefs = await SharedPreferences.getInstance();
final username = prefs.getString('username') ?? '';
final age = prefs.getInt('age') ?? 0;
final isLoggedIn = prefs.getBool('isLoggedIn') ?? false;
final tags = prefs.getStringList('tags') ?? [];
print('用户名: $username');
print('年龄: $age');
print('已登录: $isLoggedIn');
print('标签: $tags');
}
// 删除数据
Future<void> deleteData() async {
final prefs = await SharedPreferences.getInstance();
// 删除单个
await prefs.remove('username');
// 删除所有
await prefs.clear();
}
// 保存数据
Future<void> saveData() async {
final prefs = await SharedPreferences.getInstance();
// 保存字符串
await prefs.setString('username', '张三');
// 保存整数
await prefs.setInt('age', 25);
// 保存布尔值
await prefs.setBool('isLoggedIn', true);
// 保存列表(JSON 字符串)
await prefs.setStringList('tags', ['flutter', 'dart']);
}
// 读取数据
Future<void> loadData() async {
final prefs = await SharedPreferences.getInstance();
final username = prefs.getString('username') ?? '';
final age = prefs.getInt('age') ?? 0;
final isLoggedIn = prefs.getBool('isLoggedIn') ?? false;
final tags = prefs.getStringList('tags') ?? [];
print('用户名: $username');
print('年龄: $age');
print('已登录: $isLoggedIn');
print('标签: $tags');
}
// 删除数据
Future<void> deleteData() async {
final prefs = await SharedPreferences.getInstance();
// 删除单个
await prefs.remove('username');
// 删除所有
await prefs.clear();
}
文件存储
使用 path_provider 获取应用文档目录进行文件存储。
添加依赖
dependencies: path_provider: ^2.0.0
实例:文件读写
import 'dart:io';
import 'package:path_provider/path_provider.dart';
// 获取文档目录
Future<Directory> get _documentDirectory async {
return await getApplicationDocumentsDirectory();
}
// 写入文件
Future<void> writeFile() async {
final dir = await _documentDirectory;
final file = File('${dir.path}/my_file.txt');
// 写入文本
await file.writeAsString('Hello Flutter!');
// 写入字节
final bytes = [72, 101, 108, 108, 111]; // "Hello"
await file.writeAsBytes(bytes);
}
// 读取文件
Future<void> readFile() async {
final dir = await _documentDirectory;
final file = File('${dir.path}/my_file.txt');
if (await file.exists()) {
// 读取文本
final content = await file.readAsString();
print('文件内容: $content');
// 读取字节
final bytes = await file.readAsBytes();
print('字节: $bytes');
}
}
// JSON 文件存储
Future<void> saveJson() async {
final dir = await _documentDirectory;
final file = File('${dir.path}/data.json');
final data = {
'name': '张三',
'age': 25,
'skills': ['Flutter', 'Dart'],
};
// 使用 jsonEncode 保存 JSON
await file.writeAsString(jsonEncode(data));
}
import 'package:path_provider/path_provider.dart';
// 获取文档目录
Future<Directory> get _documentDirectory async {
return await getApplicationDocumentsDirectory();
}
// 写入文件
Future<void> writeFile() async {
final dir = await _documentDirectory;
final file = File('${dir.path}/my_file.txt');
// 写入文本
await file.writeAsString('Hello Flutter!');
// 写入字节
final bytes = [72, 101, 108, 108, 111]; // "Hello"
await file.writeAsBytes(bytes);
}
// 读取文件
Future<void> readFile() async {
final dir = await _documentDirectory;
final file = File('${dir.path}/my_file.txt');
if (await file.exists()) {
// 读取文本
final content = await file.readAsString();
print('文件内容: $content');
// 读取字节
final bytes = await file.readAsBytes();
print('字节: $bytes');
}
}
// JSON 文件存储
Future<void> saveJson() async {
final dir = await _documentDirectory;
final file = File('${dir.path}/data.json');
final data = {
'name': '张三',
'age': 25,
'skills': ['Flutter', 'Dart'],
};
// 使用 jsonEncode 保存 JSON
await file.writeAsString(jsonEncode(data));
}
SQLite 数据库
使用 sqflite 进行 SQLite 数据库操作。
添加依赖
dependencies: sqflite: ^2.0.0 path: ^1.8.0
实例:SQLite 基本操作
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
// 数据库帮助类
class DatabaseHelper {
static final DatabaseHelper instance = DatabaseHelper._init();
static Database? _database;
DatabaseHelper._init();
Future<Database> get database async {
if (_database != null) return _database!;
_database = await _initDB('my_app.db');
return _database!;
}
// 初始化数据库
Future<Database> _initDB(String filePath) async {
final dbPath = await getDatabasesPath();
final path = join(dbPath, filePath);
return await openDatabase(
path,
version: 1,
onCreate: _createDB,
);
}
// 创建表
Future<void> _createDB(Database db, int version) async {
await db.execute('''
CREATE TABLE users(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT NOT NULL,
age INTEGER
)
''');
}
// 插入数据
Future<int> insertUser(Map<String, dynamic> user) async {
final db = await database;
return await db.insert('users', user);
}
// 查询所有用户
Future<List<Map<String, dynamic>>> getAllUsers() async {
final db = await database;
return await db.query('users');
}
// 条件查询
Future<List<Map<String, dynamic>>> getUserByName(String name) async {
final db = await database;
return await db.query(
'users',
where: 'name = ?',
whereArgs: [name],
);
}
// 更新数据
Future<int> updateUser(int id, Map<String, dynamic> user) async {
final db = await database;
return await db.update(
'users',
user,
where: 'id = ?',
whereArgs: [id],
);
}
// 删除数据
Future<int> deleteUser(int id) async {
final db = await database;
return await db.delete(
'users',
where: 'id = ?',
whereArgs: [id],
);
}
// 关闭数据库
Future<void> close() async {
final db = await database;
db.close();
}
}
// 使用示例
Future<void> dbExample() async {
final db = DatabaseHelper.instance;
// 添加用户
await db.insertUser({
'name': '张三',
'email': 'zhangsan@example.com',
'age': 25,
});
// 查询所有
final users = await db.getAllUsers();
print('用户列表: $users');
// 更新用户
await db.updateUser(1, {'name': '李四', 'age': 30});
// 删除用户
await db.deleteUser(1);
}
import 'package:path/path.dart';
// 数据库帮助类
class DatabaseHelper {
static final DatabaseHelper instance = DatabaseHelper._init();
static Database? _database;
DatabaseHelper._init();
Future<Database> get database async {
if (_database != null) return _database!;
_database = await _initDB('my_app.db');
return _database!;
}
// 初始化数据库
Future<Database> _initDB(String filePath) async {
final dbPath = await getDatabasesPath();
final path = join(dbPath, filePath);
return await openDatabase(
path,
version: 1,
onCreate: _createDB,
);
}
// 创建表
Future<void> _createDB(Database db, int version) async {
await db.execute('''
CREATE TABLE users(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT NOT NULL,
age INTEGER
)
''');
}
// 插入数据
Future<int> insertUser(Map<String, dynamic> user) async {
final db = await database;
return await db.insert('users', user);
}
// 查询所有用户
Future<List<Map<String, dynamic>>> getAllUsers() async {
final db = await database;
return await db.query('users');
}
// 条件查询
Future<List<Map<String, dynamic>>> getUserByName(String name) async {
final db = await database;
return await db.query(
'users',
where: 'name = ?',
whereArgs: [name],
);
}
// 更新数据
Future<int> updateUser(int id, Map<String, dynamic> user) async {
final db = await database;
return await db.update(
'users',
user,
where: 'id = ?',
whereArgs: [id],
);
}
// 删除数据
Future<int> deleteUser(int id) async {
final db = await database;
return await db.delete(
'users',
where: 'id = ?',
whereArgs: [id],
);
}
// 关闭数据库
Future<void> close() async {
final db = await database;
db.close();
}
}
// 使用示例
Future<void> dbExample() async {
final db = DatabaseHelper.instance;
// 添加用户
await db.insertUser({
'name': '张三',
'email': 'zhangsan@example.com',
'age': 25,
});
// 查询所有
final users = await db.getAllUsers();
print('用户列表: $users');
// 更新用户
await db.updateUser(1, {'name': '李四', 'age': 30});
// 删除用户
await db.deleteUser(1);
}
数据存储方案选择:简单键值用 SharedPreferences,复杂结构用 SQLite,文件存储适合大文件。
