现在位置: 首页 > Flutter 教程 > 正文

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();
}

文件存储

使用 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));
}

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);
}

数据存储方案选择:简单键值用 SharedPreferences,复杂结构用 SQLite,文件存储适合大文件。