flutter存储方式
·
一、临时内存存储(非持久化)
最简单的存储方式,数据只存在于App运行期间,退出App后数据丢失
适用场景:
- 临时缓存的状态(如页面切换的临时参数)
- 无需持久化的运行时数据
核心用法:
直接使用变量、稽核(List/Map)或类对象存储即可:
// 1. 简单变量存储
String userName = "张三";
int userAge = 20;
// 2. 集合存储
List<String> favoriteFruits = ["苹果", "香蕉"];
Map<String, dynamic> userInfo = {
"name": "张三",
"age": 20,
"isVip": false
};
// 3. 自定义类存储
class User {
String name;
int age;
User(this.name, this.age);
}
User currentUser = User("张三", 20);
二、SharedPreferences(轻量级持久化)
SharedPreferences是Flutter中最常用的轻量级键值对存储方式,适合存储少量简单数据(字符串、数字、布尔值等),数据会持久化到设备本地
使用场景
- 用户偏好设置(如主题、语言、是否记住密码)
- 少量简单数据(如用户ID、登录状态)
核心用法
1、添加依赖
dependencies:
shared_preferences: ^2.2.2
2、
import 'package:shared_preferences/shared_preferences.dart';
// 存储数据
Future<void> saveData() async {
// 获取 SharedPreferences 实例
final prefs = await SharedPreferences.getInstance();
// 存储不同类型的数据
await prefs.setString('user_name', '张三'); // 字符串
await prefs.setInt('user_age', 20); // 整数
await prefs.setBool('is_login', true); // 布尔值
await prefs.setStringList('hobbies', ['读书', '运动']); // 字符串列表
}
// 读取数据
Future<void> readData() async {
final prefs = await SharedPreferences.getInstance();
// 读取数据(第二个参数是默认值,当key不存在时返回)
String? userName = prefs.getString('user_name') ?? '未知';
int userAge = prefs.getInt('user_age') ?? 0;
bool isLogin = prefs.getBool('is_login') ?? false;
List<String> hobbies = prefs.getStringList('hobbies') ?? [];
print('用户名:$userName,年龄:$userAge,是否登录:$isLogin');
}
// 删除数据
Future<void> deleteData() async {
final prefs = await SharedPreferences.getInstance();
await prefs.remove('user_name'); // 删除指定key
// await prefs.clear(); // 清空所有数据
}
三、本地文件存储(file)
通过Flutter的dart:io库操作设备本地文件、适合存储大量文本、JSON、二进制数据(如日志、离线配置)
适用场景
- 大体积文本数据(如离线文章、日志文件)
- 自定义格式的文件(如JSON、TXT)
核心用法
1、获取文件存储路径
import 'dart:io';
import 'package:path_provider/path_provider.dart';
// 获取应用文档目录(持久化,不会被系统清理)
Future<String> getDocumentPath() async {
Directory appDocDir = await getApplicationDocumentsDirectory();
return appDocDir.path;
}
2、读写文件
// 写入文件
Future<void> writeToFile() async {
String path = await getDocumentPath();
File file = File('$path/user_data.json');
// 写入JSON字符串
String jsonData = '{"name":"张三","age":20}';
await file.writeAsString(jsonData);
}
// 读取文件
Future<void> readFromFile() async {
try {
String path = await getDocumentPath();
File file = File('$path/user_data.json');
// 判断文件是否存在
if (await file.exists()) {
String content = await file.readAsString();
print('文件内容:$content');
} else {
print('文件不存在');
}
} catch (e) {
print('读取文件失败:$e');
}
}
三、SQLite数据库(结构化存储)
适合存储结构化、需要查询/关联的数据(如用户列表、订单记录),Flutter中常用sqflite库实现
适用场景
- 大量结构化数据(如商品列表、历史记录)
- 需要复杂查询(筛选、排序、联表)的数据
核心用法
1、添加依赖
dependencies:
sqflite: ^2.3.0
path: ^1.8.3
2、数据库操作示例
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
// 初始化数据库
Future<Database> initDatabase() async {
// 数据库文件路径
String dbPath = await getDatabasesPath();
String path = join(dbPath, 'user_db.db');
// 打开/创建数据库,版本号变更时会执行onUpgrade
return await openDatabase(
path,
version: 1,
onCreate: (Database db, int version) async {
// 创建表
await db.execute('''
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER
)
''');
},
);
}
// 插入数据
Future<void> insertUser() async {
Database db = await initDatabase();
await db.insert(
'users',
{'name': '张三', 'age': 20},
conflictAlgorithm: ConflictAlgorithm.replace, // 重复时替换
);
}
// 查询数据
Future<void> queryUsers() async {
Database db = await initDatabase();
// 查询所有用户
List<Map<String, dynamic>> users = await db.query('users');
// 条件查询:age > 18
// List<Map<String, dynamic>> users = await db.query('users', where: 'age > ?', whereArgs: [18]);
print('用户列表:$users');
// 转换为实体类(可选)
// List<User> userList = users.map((e) => User.fromMap(e)).toList();
}
// 更新/删除数据
Future<void> updateUser() async {
Database db = await initDatabase();
await db.update(
'users',
{'age': 21},
where: 'name = ?',
whereArgs: ['张三'],
);
}
Future<void> deleteUser() async {
Database db = await initDatabase();
await db.delete(
'users',
where: 'id = ?',
whereArgs: [1],
);
}
五、安全存储
如果需要存储敏感数据(如密码、Token、支付信息),普通存储方式存在泄露风险,推荐使用flutter_secure_storage,数据会加密存储
适用场景
- 登录Token、JWT
- 支付密码、银行卡信息
- 其他敏感隐私数据
核心用法
1、添加依赖
dependencies:
flutter_secure_storage: ^8.0.0
2、
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
// 初始化安全存储
final storage = FlutterSecureStorage();
// 存储敏感数据
Future<void> saveSecureData() async {
await storage.write(key: 'user_token', value: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...');
await storage.write(key: 'pay_password', value: '123456');
}
// 读取敏感数据
Future<void> readSecureData() async {
String? token = await storage.read(key: 'user_token');
String? payPwd = await storage.read(key: 'pay_password');
print('Token:$token,支付密码:$payPwd');
}
// 删除敏感数据
Future<void> deleteSecureData() async {
await storage.delete(key: 'pay_password');
// await storage.deleteAll(); // 清空所有安全数据
}
选择存储方式的核心原则:
根据数据的大小、类型、安全性和查询需求匹配最合适的方案
更多推荐
所有评论(0)