Flutter 文件存储详解

文章总体概览信息图

一、文件存储概述

Flutter 文件存储用于持久化数据到本地文件系统。常见的存储方式包括 SharedPreferences、Hive、SQFlite 和直接文件操作。

1.1 存储类型

  • 键值存储 - SharedPreferences、Hive
  • 关系型数据库 - SQFlite
  • 文件存储 - 直接读写文件

二、SharedPreferences

2.1 安装依赖

dependencies:
  shared_preferences: ^2.2.0

2.2 使用示例

import 'package:shared_preferences/shared_preferences.dart';

class StorageService {
  static late SharedPreferences _prefs;

  static Future<void> init() async {
    _prefs = await SharedPreferences.getInstance();
  }

  static String? getString(String key) {
    return _prefs.getString(key);
  }

  static Future<bool> setString(String key, String value) {
    return _prefs.setString(key, value);
  }

  static int? getInt(String key) {
    return _prefs.getInt(key);
  }

  static Future<bool> setInt(String key, int value) {
    return _prefs.setInt(key, value);
  }
}

三、Hive

3.1 安装依赖

dependencies:
  hive: ^2.2.3
  hive_flutter: ^1.1.0

dev_dependencies:
  hive_generator: ^1.1.5
  build_runner: ^2.4.4

3.2 创建模型

import 'package:hive/hive.dart';

part 'user.g.dart';

@HiveType(typeId: 0)
class User extends HiveObject {
  @HiveField(0)
  late String name;

  @HiveField(1)
  late int age;

  User({required this.name, required this.age});
}

3.3 生成代码

flutter pub run build_runner build

3.4 使用示例

class HiveService {
  static late Box<User> _userBox;

  static Future<void> init() async {
    await Hive.initFlutter();
    Hive.registerAdapter(UserAdapter());
    _userBox = await Hive.openBox<User>('users');
  }

  static void addUser(User user) {
    _userBox.add(user);
  }

  static List<User> getUsers() {
    return _userBox.values.toList();
  }
}

四、SQFlite

4.1 安装依赖

dependencies:
  sqflite: ^2.3.0
  path: ^1.8.3

4.2 创建数据库

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

class DatabaseHelper {
  static final DatabaseHelper _instance = DatabaseHelper._internal();
  factory DatabaseHelper() => _instance;
  DatabaseHelper._internal();

  static Database? _database;

  Future<Database> get database async {
    if (_database != null) return _database!;
    _database = await _initDatabase();
    return _database!;
  }

  Future<Database> _initDatabase() async {
    final path = join(await getDatabasesPath(), 'my_database.db');
    return await openDatabase(
      path,
      version: 1,
      onCreate: (db, version) async {
        await db.execute('''
          CREATE TABLE users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            email TEXT NOT NULL UNIQUE
          )
        ''');
      },
    );
  }
}

五、文件操作

5.1 读取文件

import 'dart:io';

Future<String> readFile(String path) async {
  final file = File(path);
  return await file.readAsString();
}

5.2 写入文件

Future<void> writeFile(String path, String content) async {
  final file = File(path);
  await file.writeAsString(content);
}

5.3 获取应用目录

import 'package:path_provider/path_provider.dart';

Future<String> getApplicationDocumentsDirectory() async {
  final directory = await getApplicationDocumentsDirectory();
  return directory.path;
}

六、实战案例

6.1 完整存储服务

class StorageService {
  static Future<void> saveUser(User user) async {
    // 使用 SharedPreferences 存储简单数据
    final prefs = await SharedPreferences.getInstance();
    await prefs.setString('user_name', user.name);
    
    // 使用 Hive 存储对象
    final box = await Hive.openBox<User>('users');
    await box.add(user);
  }
}

七、总结

文件存储方案选择:

  1. 简单数据 - SharedPreferences
  2. 复杂对象 - Hive
  3. 关系型数据 - SQFlite
  4. 文件 - 直接文件操作

根据需求选择合适的存储方式。

更多推荐