一、临时内存存储(非持久化)

最简单的存储方式,数据只存在于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(); // 清空所有安全数据
}

选择存储方式的核心原则:
根据数据的大小、类型、安全性和查询需求匹配最合适的方案

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐