news 2026/5/11 23:29:39

Flutter 本地存储完全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flutter 本地存储完全指南

Flutter 本地存储完全指南

引言

本地存储是移动应用开发中不可或缺的一部分,它允许应用在设备上持久化数据。Flutter 提供了多种本地存储方案,本文将深入探讨各种存储方式和最佳实践。

存储方案概述

方案适用场景数据类型大小限制
SharedPreferences简单键值对基本类型较小
GetStorage简单键值对基本类型较大
SQLite复杂数据关系型数据较大
HiveNoSQL 数据库对象较大
File文件存储任意文件较大

高级技巧一:SharedPreferences

基本用法

import 'package:shared_preferences/shared_preferences.dart'; // 保存数据 final prefs = await SharedPreferences.getInstance(); await prefs.setInt('counter', 42); await prefs.setString('username', 'John'); await prefs.setBool('isDarkMode', true); // 读取数据 int? counter = prefs.getInt('counter'); String? username = prefs.getString('username'); bool? isDarkMode = prefs.getBool('isDarkMode'); // 删除数据 await prefs.remove('counter'); await prefs.clear();

封装存储服务

class PreferencesService { static late SharedPreferences _prefs; static Future<void> init() async { _prefs = await SharedPreferences.getInstance(); } static int get counter => _prefs.getInt('counter') ?? 0; static set counter(int value) => _prefs.setInt('counter', value); static String get username => _prefs.getString('username') ?? ''; static set username(String value) => _prefs.setString('username', value); static bool get isDarkMode => _prefs.getBool('isDarkMode') ?? false; static set isDarkMode(bool value) => _prefs.setBool('isDarkMode', value); }

高级技巧二:GetStorage

基本用法

import 'package:get_storage/get_storage.dart'; // 初始化 await GetStorage.init(); final box = GetStorage(); // 保存数据 box.write('user', {'name': 'John', 'age': 30}); box.write('counter', 42); // 读取数据 Map<String, dynamic>? user = box.read('user'); int counter = box.read('counter') ?? 0; // 删除数据 box.remove('user'); box.erase();

监听变化

box.listenKey('counter', (value) { print('Counter changed: $value'); });

高级技巧三:Hive 数据库

配置 Hive

import 'package:hive/hive.dart'; import 'package:hive_flutter/hive_flutter.dart'; // 初始化 await Hive.initFlutter(); // 注册适配器 Hive.registerAdapter(UserAdapter()); // 打开盒子 final box = await Hive.openBox<User>('users');

创建数据模型

part 'user.g.dart'; @HiveType(typeId: 0) class User { @HiveField(0) final String name; @HiveField(1) final int age; @HiveField(2) final String email; User({required this.name, required this.age, required this.email}); }

操作数据

// 添加数据 final user = User(name: 'John', age: 30, email: 'john@example.com'); await box.add(user); // 获取数据 User? user = box.getAt(0); User? userByKey = box.get('user1'); // 更新数据 user.name = 'John Updated'; await user.save(); // 删除数据 await box.deleteAt(0); await box.clear();

高级技巧四:SQLite 数据库

使用 moor

import 'package:moor/moor.dart'; import 'package:moor_flutter/moor_flutter.dart'; // 创建数据库 class AppDatabase extends _$AppDatabase { AppDatabase() : super(FlutterQueryExecutor.inDatabaseFolder(path: 'db.sqlite')); @override int get schemaVersion => 1; // 表定义 final users = Table('users'); final id = users.int().autoIncrement(); final name = users.text(); final age = users.integer(); } // 操作数据 final db = AppDatabase(); // 插入 await db.into(db.users).insert(UsersCompanion.insert( name: 'John', age: 30, )); // 查询 final users = await db.select(db.users).get(); final user = await (db.select(db.users)..where((u) => u.id.equals(1))).getSingle(); // 更新 await (db.update(db.users)..where((u) => u.id.equals(1))).write(UsersCompanion( name: Value('John Updated'), )); // 删除 await (db.delete(db.users)..where((u) => u.id.equals(1))).go();

高级技巧五:文件存储

基本文件操作

import 'dart:io'; import 'package:path_provider/path_provider.dart'; // 获取目录 final directory = await getApplicationDocumentsDirectory(); final filePath = '${directory.path}/data.txt'; // 写入文件 await File(filePath).writeAsString('Hello, World!'); // 读取文件 String content = await File(filePath).readAsString(); // 删除文件 await File(filePath).delete();

序列化对象

import 'dart:convert'; // 序列化 final user = {'name': 'John', 'age': 30}; final jsonString = jsonEncode(user); await File(filePath).writeAsString(jsonString); // 反序列化 final jsonString = await File(filePath).readAsString(); final user = jsonDecode(jsonString) as Map<String, dynamic>;

实战案例:主题状态持久化

class ThemeService { static const String _key = 'theme_mode'; static Future<ThemeMode> getThemeMode() async { final prefs = await SharedPreferences.getInstance(); final mode = prefs.getString(_key); switch (mode) { case 'dark': return ThemeMode.dark; case 'light': return ThemeMode.light; default: return ThemeMode.system; } } static Future<void> setThemeMode(ThemeMode mode) async { final prefs = await SharedPreferences.getInstance(); String value; switch (mode) { case ThemeMode.dark: value = 'dark'; break; case ThemeMode.light: value = 'light'; break; default: value = 'system'; } await prefs.setString(_key, value); } }

实战案例:用户数据持久化

class UserRepository { final Box<User> _box; UserRepository(this._box); Future<void> saveUser(User user) async { await _box.put(user.id.toString(), user); } User? getUser(String id) { return _box.get(id); } Future<void> deleteUser(String id) async { await _box.delete(id); } List<User> getAllUsers() { return _box.values.toList(); } }

常见问题与解决方案

Q1:如何处理数据迁移?

A:使用 Hive 的迁移机制:

final box = await Hive.openBox('data', migration: (oldVersion, newVersion) { if (oldVersion == 1) { // 迁移逻辑 } });

Q2:如何加密数据?

A:使用加密包:

import 'package:hive/hive.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'package:encrypt/encrypt.dart'; // 创建加密适配器 final encryptionKey = Hive.generateSecureKey(); final box = await Hive.openBox('secureBox', encryptionCipher: HiveAesCipher(encryptionKey));

Q3:如何处理大文件?

A:使用文件分块读写:

final file = File('large_file.bin'); final stream = file.openRead(); await for (var chunk in stream) { // 处理每个块 }

最佳实践

1. 封装存储逻辑

// 错误:直接在 Widget 中使用 final prefs = await SharedPreferences.getInstance(); await prefs.setInt('counter', 42); // 正确:封装到服务类 await PreferencesService.setCounter(42);

2. 使用异步操作

// 错误:同步阻塞 final value = prefs.getInt('key'); // 正确:异步处理 final value = await PreferencesService.getValue();

3. 处理异常

try { await db.insert(user); } catch (e) { // 处理错误 }

总结

本地存储是 Flutter 应用的重要组成部分。通过本文的学习,你应该能够:

  1. 选择合适的存储方案
  2. 使用 SharedPreferences 存储简单数据
  3. 使用 Hive 存储复杂对象
  4. 使用 SQLite 存储关系型数据
  5. 实现数据持久化和恢复

掌握这些技巧,能够帮助你构建更加可靠的应用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 23:29:00

【无人机编队控制5】多无人机分布式系统,协同路径规划与避碰,使用改进APF(人工势场法)。附MATLAB代码

代码实现:动态环境下多无人机系统协同路径规划与自主避碰的完整仿真框架。针对5架无人机在三维空间中的协同飞行任务,采用改进人工势场法(APF)生成实时航迹,并通过引入速度障碍防撞思想增强无人机之间的碰撞避免能力,同时结合静态柱状障碍物和动态球形障碍物检验规划算法…

作者头像 李华
网站建设 2026/5/11 23:26:08

2026年手机照片恢复新技能,误删也能轻松找回

引言“照片没了&#xff0c;回忆还在吗&#xff1f;”这是许多人在误删手机照片后发出的灵魂拷问。在2026年&#xff0c;随着手机存储技术从NAND闪存向更高密度、更复杂架构演进&#xff0c;数据恢复的难度与可能性都发生了显著变化。很多人认为照片删除后就是“彻底消失”&…

作者头像 李华
网站建设 2026/5/11 23:26:07

苹果手机聊天记录恢复

在移动互联网时代&#xff0c;微信、iMessage 等应用中的聊天记录承载着工作沟通、情感回忆乃至法律证据等重要信息。然而&#xff0c;误删除、系统崩溃或设备损坏导致聊天记录丢失&#xff0c;已成为许多苹果用户棘手的痛点。本文将结合主流平台审核标准与生成式搜索引擎收录规…

作者头像 李华
网站建设 2026/5/11 23:25:31

Python 三大内置高阶函数:map、filter、reduce

一、核心概念高阶函数&#xff1a;可以把函数当作参数传入的函数。Python 最常用三个内置高阶函数&#xff1a;map、filter、reduce1. map () 映射作用&#xff1a;对可迭代对象每个元素统一做加工处理&#xff0c;返回迭代器。语法&#xff1a;map(函数, 可迭代对象)底层逻辑&…

作者头像 李华
网站建设 2026/5/11 23:25:19

Python 爬虫高级实战:大数据平台爬虫数据对接

前言 大数据时代下,各类政务大数据平台、行业数据中台、商业大数据门户均采用前后端分离架构承载海量结构化与非结构化数据,这类平台具备数据接口权限校验、分页加密加载、数据字段脱敏、访问流量风控等多重特性。常规单站点爬虫仅能完成孤立页面数据采集,无法实现爬虫原始…

作者头像 李华
网站建设 2026/5/11 23:24:56

你的桌面可以养宠物吗?用DyberPet打造专属数字伙伴

你的桌面可以养宠物吗&#xff1f;用DyberPet打造专属数字伙伴 【免费下载链接】DyberPet Desktop Cyber Pet Framework based on PySide6 项目地址: https://gitcode.com/GitHub_Trending/dy/DyberPet 想象一下&#xff0c;当你埋头工作时&#xff0c;一个可爱的猫咪角…

作者头像 李华