Flutter 学习之旅 之 flutter 使用 shared_preferences 实现简单的数据本地化保存封装

ops/2025/3/15 5:14:47/

flutter%20%E4%BD%BF%E7%94%A8%20shared_preferences%20%E5%AE%9E%E7%8E%B0%E7%AE%80%E5%8D%95%E7%9A%84%E6%95%B0%E6%8D%AE%E6%9C%AC%E5%9C%B0%E5%8C%96%E4%BF%9D%E5%AD%98%E5%B0%81%E8%A3%85" name="Flutter%20%E5%AD%A6%E4%B9%A0%E4%B9%8B%E6%97%85%20%E4%B9%8B%20flutter%20%E4%BD%BF%E7%94%A8%20shared_preferences%20%E5%AE%9E%E7%8E%B0%E7%AE%80%E5%8D%95%E7%9A%84%E6%95%B0%E6%8D%AE%E6%9C%AC%E5%9C%B0%E5%8C%96%E4%BF%9D%E5%AD%98%E5%B0%81%E8%A3%85">Flutter 学习之旅 之 flutter 使用 shared_preferences 实现简单的数据本地化保存封装

目录

flutter%20%E4%BD%BF%E7%94%A8%20shared_preferences%20%E5%AE%9E%E7%8E%B0%E7%AE%80%E5%8D%95%E7%9A%84%E6%95%B0%E6%8D%AE%E6%9C%AC%E5%9C%B0%E5%8C%96%E4%BF%9D%E5%AD%98%E5%B0%81%E8%A3%85-toc" name="tableOfContents" style="margin-left:0px">Flutter 学习之旅 之 flutter 使用 shared_preferences 实现简单的数据本地化保存封装

一、简单介绍

1. shared_preferences

2. sqflite

3. file

二、shared_preferences

开发注意事项

使用注意事项

flutter-toc" name="tableOfContents" style="margin-left:80px">三、安装 shared_preferences

四、简单效果

五、简单案例实现

六、关键代码


一、简单介绍

Flutter 是一款开源的 UI 软件开发工具包,由 Google 开发和维护。它允许开发者使用一套代码同时构建跨平台的应用程序,包括移动设备(iOS 和 Android)、Web 和桌面平台(Windows、macOS 和 Linux)。

Flutter 使用 Dart 编程语言,它可以将代码编译为 ARM 或 Intel 机器代码以及 JavaScript,从而实现快速的性能。Flutter 提供了一个丰富的预置小部件库,开发者可以根据自己的需求灵活地控制每个像素,从而创建自定义的、适应性强的设计,这些设计在任何屏幕上都能呈现出色的外观和感觉。

1. shared_preferences

  • 简介shared_preferences 是一个简单的键值存储解决方案,适合存储少量数据,如用户偏好设置、配置信息等。

  • 特点

    • 简单易用:提供简单的 API,如 setStringgetInt 等,方便保存和读取数据

    • 数据类型支持:支持常见的数据类型,如 Stringintbooldouble 等。

    • 异步操作:所有操作都是异步的,不会阻塞主线程。

  • 适用场景:适用于存储少量简单的键值对数据,不适合存储大量或复杂的数据

2. sqflite

  • 简介sqflite 是一个用于与 SQLite 数据库交互的 Flutter 插件,适合存储结构化数据

  • 特点

    • 结构化存储:支持复杂的数据结构,可以存储大量数据

    • SQL 支持:通过 SQL 语句进行数据操作,适合复杂的查询和事务处理。

    • 持久化存储数据存储在本地数据库文件中,应用卸载后数据不会丢失。

  • 适用场景:适用于需要存储大量结构化数据的应用,如待办事项、用户信息等。

3. file

  • 简介:使用 Dart 的 File 类直接操作文件系统,适合存储自定义格式的数据

  • 特点

    • 直接操作:可以直接读写文件,支持二进制文件和文本文件。

    • 灵活性高:可以根据需要自定义数据格式和存储逻辑。

  • 适用场景:适用于需要存储自定义格式数据(如 JSON 文件、二进制文件等)的应用。

二、shared_preferences

官网地址:shared_preferences | Flutter package

shared_preferences 是 Flutter 中用于本地存储键值对数据的插件。它简单易用,适合存储少量数据,如用户偏好设置、配置信息等。通过 SharedPreferences.getInstance() 获取实例后,可使用 setStringsetIntsetBool 等方法保存数据,用 getStringgetIntgetBool 等方法获取数据,还可用 remove 删除指定键的数据。它基于平台的本地存储机制,如 Android 的 SharedPreferences 和 iOS 的 UserDefaults,数据存储在设备本地,应用卸载后数据会丢失。

在开发和使用 shared_preferences 时,需要注意以下几点:

开发注意事项

  1. 异步操作shared_preferences 的操作是异步的,需要使用 awaitthen 来处理结果,避免数据未保存或读取完成就执行后续逻辑。

  2. 类型匹配:保存和读取数据时,要确保类型一致。例如,保存时使用 setInt,读取时必须用 getInt,否则会报错。

  3. 初始化检查:在使用 shared_preferences 前,需确保实例已初始化完成,通常通过 await SharedPreferences.getInstance() 来获取实例。

  4. 错误处理:操作过程中可能会出现错误(如存储空间不足等),建议添加错误处理逻辑,避免应用崩溃。

使用注意事项

  1. 存储容量限制shared_preferences 适合存储少量数据,如用户偏好设置等,不适合存储大量数据,否则可能影响性能。

  2. 数据安全性:存储在 shared_preferences 中的数据是明文存储的,不适合存储敏感信息(如密码等),若需存储敏感信息,应进行加密处理。

  3. 数据持久性:存储的数据会随着应用卸载而丢失,若需要数据在卸载后仍保留,需考虑其他存储方案。

  4. 跨平台差异:虽然 shared_preferences 在 Android 和 iOS 上都能使用,但底层实现不同,可能会有细微差异,建议在不同平台上进行充分测试。

flutter" name="%E4%B8%89%E3%80%81%E5%AE%89%E8%A3%85%20webview_flutter">三、安装 shared_preferences

1、直接运行命令:flutter pub add shared_preferences

2、或者在 pubspec.yaml 添加

dependencies:shared_preferences: ^2.5.2

四、简单效果

五、简单案例实现

1、这里使用 Android Studio 进行创建 Flutter 项目

2、创建一个 application 的 Flutter 项目

3、编写一个 SharedPreferencesHelper


4、在 main 中测试

5、连接设备,运行效果如下

六、关键代码

1、SharedPreferencesHelper

import 'package:shared_preferences/shared_preferences.dart';class SharedPreferencesHelper {// 保存数据到 SharedPreferences// 参数:// - key: 存储的键// - value: 要保存的值,支持 String、int、bool、double 类型// 异常:// - 如果 value 的类型不支持,会抛出异常static Future<void> saveData<T>(String key, T value) async {// 获取 SharedPreferences 实例final prefs = await SharedPreferences.getInstance();// 根据 value 的类型调用不同的保存方法if (value is String) {await prefs.setString(key, value); // 保存字符串} else if (value is int) {await prefs.setInt(key, value); // 保存整数} else if (value is bool) {await prefs.setBool(key, value); // 保存布尔值} else if (value is double) {await prefs.setDouble(key, value); // 保存浮点数} else {// 如果 value 的类型不支持,抛出异常throw Exception('Unsupported type');}}// 从 SharedPreferences 获取数据// 参数:// - key: 存储的键// - T: 指定返回值的类型,必须是 String、int、bool、double 中的一种// 返回值:// - 如果 key 存在,返回对应的值;否则返回 null// 异常:// - 如果 T 不是支持的类型,会抛出异常static Future<T?> getData<T>(String key) async {// 获取 SharedPreferences 实例final prefs = await SharedPreferences.getInstance();// 根据 T 的类型调用不同的获取方法if (T == String) {return prefs.getString(key) as T?; // 获取字符串} else if (T == int) {return prefs.getInt(key) as T?; // 获取整数} else if (T == bool) {return prefs.getBool(key) as T?; // 获取布尔值} else if (T == double) {return prefs.getDouble(key) as T?; // 获取浮点数} else {// 如果 T 不是支持的类型,抛出异常throw Exception('Unsupported type');}}// 从 SharedPreferences 删除指定的键值对// 参数:// - key: 要删除的键static Future<void> removeData(String key) async {// 获取 SharedPreferences 实例final prefs = await SharedPreferences.getInstance();// 删除指定的键值对await prefs.remove(key);}
}

代码说明

  1. saveData 方法

    • 通过 SharedPreferences.getInstance() 获取实例。

    • 根据 value 的类型调用对应的保存方法(setStringsetInt 等)。

    • 如果 value 的类型不支持,抛出异常。

  2. getData 方法

    • 通过 SharedPreferences.getInstance() 获取实例。

    • 根据泛型参数 T 的类型调用对应的获取方法(getStringgetInt 等)。

    • 如果键不存在,返回 null

    • 如果 T 的类型不支持,抛出异常。

  3. removeData 方法

    • 通过 SharedPreferences.getInstance() 获取实例。

    • 调用 remove 方法删除指定的键值对。

这些注释可以帮助开发者快速理解每个方法的功能和使用方式,避免常见错误。

2、main

import 'package:flutter/material.dart';
import 'package:test_shared_preferences/shared_preferences_helper.dart';void main() {runApp(MyApp());
}// MyApp 是整个应用的入口,继承自 StatelessWidget
class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {// 使用 MaterialApp 创建一个简单的 Flutter 应用return MaterialApp(home: HomeScreen(), // 设置应用的首页为 HomeScreen);}
}// HomeScreen 是应用的主页,继承自 StatefulWidget
// 因为需要在页面中保存和加载数据,所以需要使用 StatefulWidget
class HomeScreen extends StatefulWidget {@override_HomeScreenState createState() => _HomeScreenState();
}// _HomeScreenState 是 HomeScreen 的状态类
class _HomeScreenState extends State<HomeScreen> {final _controller = TextEditingController(); // 创建一个 TextEditingController,用于控制 TextFieldString _savedValue = ''; // 用于存储从 SharedPreferences 中加载的值@overridevoid initState() {super.initState();_loadSavedValue(); // 在页面初始化时加载保存的值}// _loadSavedValue 是一个异步方法,用于从 SharedPreferences 中加载数据Future _loadSavedValue() async {final value = await SharedPreferencesHelper.getData<String>('my_key'); // 从 SharedPreferences 中获取键为 'my_key' 的值setState(() {_savedValue = value ?? ''; // 如果值为空,则默认为空字符串_controller.text = _savedValue; // 将加载的值设置到 TextField 的控制器中});}// _saveValue 是一个方法,用于将用户输入的值保存到 SharedPreferences 中void _saveValue() async {final value = _controller.text; // 获取 TextField 中的值await SharedPreferencesHelper.saveData('my_key', value); // 将值保存到 SharedPreferences 中,键为 'my_key'setState(() {_savedValue = value; // 更新保存的值});}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('SharedPreferences Example'), // 设置应用栏标题),body: Padding(padding: EdgeInsets.all(16.0), // 设置页面的内边距child: Column(children: [TextField(controller: _controller, // 将控制器绑定到 TextFielddecoration: InputDecoration(labelText: 'Enter a value'), // 设置 TextField 的装饰,显示提示文本),ElevatedButton(onPressed: _saveValue, // 点击按钮时调用 _saveValue 方法child: Text('Save'), // 设置按钮的文本),Text('Saved Value: $_savedValue'), // 显示保存的值],),),);}
}

代码说明

  1. MyApp

    • 是整个应用的入口,使用 MaterialApp 创建一个简单的 Flutter 应用,并设置首页为 HomeScreen

  2. HomeScreen

    • 是应用的主页,继承自 StatefulWidget,因为需要在页面中保存和加载数据,所以需要使用 StatefulWidget

  3. _HomeScreenState

    • HomeScreen 的状态类,包含以下功能:

      • 使用 _controller 控制 TextField,方便获取用户输入的值。

      • 在页面初始化时调用 _loadSavedValue 方法,从 SharedPreferences 中加载保存的值。

      • _loadSavedValue 方法是异步的,从 SharedPreferences 中获取键为 'my_key' 的值,并更新 _savedValue_controller.text

      • _saveValue 方法将用户输入的值保存到 SharedPreferences 中,键为 'my_key',并更新 _savedValue

      • 页面布局包含一个 TextField 用于输入值,一个 ElevatedButton 用于保存值,以及一个 Text 用于显示保存的值。

通过这些注释,开发者可以快速理解代码的结构和功能,方便后续的开发和维护。


http://www.ppmy.cn/ops/165858.html

相关文章

matlab慕课学习3.2+3.3

于20250310 3.2用if语句实现选择结构 3.2.1什么是选择结构 用if 语句和switch语句可实现选择结构 3.2.2单分支if语句 if 条件语句组 %可以是一条也可是多条end 当条件为标量&#xff0c;非0表成立&#xff0c;0表示不成立。 当条件为矩阵时&#xff0c;矩阵非空&#xff…

从Spring容器中获取bean

从Spring容器中获取bean Spring自带了多种类型的应用上下文。下面罗列的几个最常用的&#xff1a; AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文。AnnotationConfigWebApplicationContext&#xff1a;从一个或多个基于Java的配置类…

驾培市场与低空经济无人机融合技术详解

随着科技的飞速发展和社会的不断进步&#xff0c;驾培市场正面临着前所未有的变革。传统汽车驾驶培训已不再是唯一的选择&#xff0c;无人机驾驶等新兴领域正逐渐成为驾培市场的重要组成部分。本报告旨在探讨驾培市场与低空经济的融合发展&#xff0c;特别是应用型人才培养与驾…

深度学习——Diffusion Model学习,扩散模型

一、什么是扩散模型 针对一张图片有一个前向过程&#xff0c;也就是逐渐批次加噪&#xff0c;生成一张Noise图片&#xff0c;那么问题就是是不是有这样的一个反向的过程能够针对一个有噪点的数据&#xff0c;还原到清晰的图片 具体来说&#xff1a;通过加入0-1正态分布的高斯噪…

第27周JavaSpringboot 前后端联调

电商前后端联调课程笔记 一、项目启动与环境搭建 1.1 项目启动 在学习电商项目的前后端联调之前&#xff0c;需要先掌握如何启动项目。项目启动是整个开发流程的基础&#xff0c;只有成功启动项目&#xff0c;才能进行后续的开发与调试工作。 1.1.1 环境安装 环境安装是项…

Celery - 入门(get-started)

本文翻译整理自 Celery 官方文档 get-started 部分&#xff1a;https://docs.celeryq.dev/en/stable/getting-started/index.html 文章目录 Celery 简介任务队列是什么&#xff1f;我需要什么&#xff1f;版本要求 开始使用Celery 优点简单高度可用快灵活 特性框架集成快速跳转…

游戏引擎学习第140天

回顾并为今天的内容做准备 目前代码的进展到了声音混音的部分。昨天我详细解释了声音的处理方式&#xff0c;声音在技术上是一个非常特别的存在&#xff0c;但在游戏中进行声音混音的需求其实相对简单明了&#xff0c;所以今天的任务应该不会太具挑战性。 今天我们会编写一个…

zsh: command not found: adb 报错问题解决

哈喽小伙伴们大家好&#xff0c;我是小李&#xff0c;今天&#xff0c;我满怀信心想要在本地跑一下pda,然而&#xff0c; what? 居然报错了&#xff01;&#xff01;别逗我啊&#xff01; 好吧&#xff0c;究其原因&#xff1a;没有配置好sdk 那就配呗。 首先&#xff0c;…