[Flutter]shared_preferences基本用法以及可视化管理存储的key和value类型

shared_preferences 是一个Flutter插件,它提供了一种简单的方式来在应用程序中存储和获取持久化的键值对数据。它可以用于存储应用程序的配置信息、用户偏好设置、登录状态等。

使用 shared_preferences 插件,你可以在应用程序中轻松地保存和读取数据,而无需处理底层的持久化细节。它基于平台的本地存储机制,例如Android中的SharedPreferences和iOS中的NSUserDefaults。

shared_preferences基本用法

以下是使用 shared_preferences 插件的基本操作:

1.添加依赖

在你的Flutter项目的 pubspec.yaml 文件中添加 shared_preferences 依赖。

dependencies:shared_preferences: ^2.2.2

2.导入插件

在需要使用 shared_preferences 的文件中导入插件。

import 'package:shared_preferences/shared_preferences.dart';

3.存储数据

使用 SharedPreferences.getInstance() 方法获取 SharedPreferences 实例,并使用 setXxx() 方法存储数据。

SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('username', 'John');
prefs.setInt('age', 25);

4.读取数据

使用 SharedPreferences.getInstance() 方法获取 SharedPreferences 实例,并使用 getXxx() 方法读取数据。

SharedPreferences prefs = await SharedPreferences.getInstance();
String username = prefs.getString('username');
int age = prefs.getInt('age');

5.删除数据

使用 SharedPreferences.getInstance() 方法获取 SharedPreferences 实例,并使用 remove() 方法删除指定键的数据。

SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.remove('username');

通过使用 shared_preferences 插件,你可以方便地在Flutter应用程序中存储和获取持久化的数据。请注意,这些数据是应用程序私有的,只能在当前设备上访问。

可视化管理shared_preferences中的key和value类型

看了上面shared_preferences的基本用法,我们会发现,直接使用时会导致定义的key特别分散。开发者无法一目了然的查看,现在shared_preferences中定义了哪些key,对应的value又是什么类型。

1.使用

await SharedPreferencesManager.instance.set(SharedPreferencesKey.didGuide, true);bool? res = await SharedPreferencesManager.instance.get(SharedPreferencesKey.didGuide);

2.封装SharedPreferencesManager

import 'package:shared_preferences/shared_preferences.dart';/// 管理SharedPreferences的键和值。
class SharedPreferencesManager {// 单例对象static final SharedPreferencesManager _instance =SharedPreferencesManager._internal();// SharedPreferences的实例late SharedPreferences _prefs;// 私有构造函数,用于创建类的单例实例SharedPreferencesManager._internal() {_init();}// 异步初始化,确保在使用SharedPreferences之前已完成初始化void _init() async {_prefs = await SharedPreferences.getInstance();}// 私有方法,确保SharedPreferences实例已初始化Future<void> _ensureInitialized() async {if (_prefs == null) {_init();}}// 提供一个getter来获取单例对象static SharedPreferencesManager get instance => _instance;// 使用泛型方法来获取键对应的值。// 根据泛型参数T的类型,决定使用哪个SharedPreferences的getter方法。Future<T?> get<T>(SharedPreferencesKey key) async {await _ensureInitialized(); // 确保_prefs已初始化if (T == String) {return _prefs.getString(key.toString()) as T?;} else if (T == bool) {return _prefs.getBool(key.toString()) as T?;} else if (T == int) {return _prefs.getInt(key.toString()) as T?;} else if (T == double) {return _prefs.getDouble(key.toString()) as T?;} else if (T == List) {// 特别注意:我们假设List类型指的是List<String>return _prefs.getStringList(key.toString()) as T?;} else {// 如果类型不支持,则抛出异常throw Exception('Unsupported type');}}// 使用泛型方法设置值Future<bool> set<T>(SharedPreferencesKey key, T value) async {await _ensureInitialized();String keyString = key.toString();if (value is String) {return _prefs.setString(keyString, value);} else if (value is bool) {return _prefs.setBool(keyString, value);} else if (value is int) {return _prefs.setInt(keyString, value);} else if (value is double) {return _prefs.setDouble(keyString, value);} else if (value is List<String>) {return _prefs.setStringList(keyString, value);} else {throw Exception('Unsupported type');}}
}/// 定义一个枚举,包含所有keys和它们对应的类型
enum SharedPreferencesKey {didGuide(bool), // 引导状态的键,与布尔类型关联username(String),themeMode(String);// 存储枚举值关联的类型final Type type;// 枚举构造函数const SharedPreferencesKey(this.type);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/717303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中线程相关的知识

创建子线程的三种方式: 1.自定义线程任务类继承线程类&#xff0c;以便继承其功能,重写其run方法(里面写自己需要实现的功能)&#xff0c;在main方法调用时创建其任务类实例化对象&#xff0c;然后调用对象的start方法(继承自父类)&#xff0c;即成功创建线程 优点:创建方式简…

Pandas DataFrame 基本操作实例100个

Pandas 是一个基于NumPy的数据分析模块&#xff0c;最初由AQR Capital Management于2008年4月开发&#xff0c;并于2009年底开源。Pandas的名称来源于“Panel Data”&#xff08;面板数据&#xff09;和“Python数据分析”&#xff08;data analysis&#xff09;。这个库现在由…

来不及了!大学必须完成的四件事!

老师们常说&#xff0c;上大学就轻松了 其实不然 大学不是人生的终点&#xff0c;而是新的起跑线 不是休息站&#xff0c;而是进入社会的最后冲刺跑道 大学生活苦乐参半&#xff0c;成人世界即将来临 出了校门&#xff0c;你会发现社会复杂多变&#xff0c;需要不断学习 稍…

excel中如何使用VLOOKUP和EXACT函数实现区分大小写匹配数据

在 Excel 中&#xff0c;VLOOKUP 函数默认情况下是不区分大小写的&#xff1a; 比如下面的案例&#xff0c;直接使用VLOOKUP函数搜索&#xff0c;只会搜索匹配到不区分大小写的第一个 如果我们想要实现区分大小写的精确匹配&#xff0c;可以使用 EXACT 函数结合 VLOOKUP 函数 …

【简说八股】Redisson的守护线程是怎么实现的

Redisson Redisson 是一个 Java 语言实现的 Redis SDK 客户端&#xff0c;在使用分布式锁时&#xff0c;它就采用了「自动续期」的方案来避免锁过期&#xff0c;这个守护线程我们一般也把它叫做「看门狗」线程。 Redission是一个在Java环境中使用的开源的分布式缓存和分布式锁实…

PyTorch-卷积神经网络

卷积神经网络 基本结构 首先解释一下什么是卷积&#xff0c;这个卷积当然不是数学上的卷积&#xff0c;这里的卷积其实表示的是一个三维的权重&#xff0c;这么解释起来可能不太理解&#xff0c;我们先看看卷积网络的基本结构。 通过上面的图我们清楚地了解到卷积网络和一般网…

【Javascript】设计模式之发布订阅模式

文章目录 1、现实中的发布&#xff0d;订阅模式2、DOM 事件3、简单的发布-订阅模式4、通用的发布-订阅模式5、先发布再订阅6、小结 发布—订阅模式又叫观察者模式&#xff0c;它定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于…

Mysql深入学习 基础篇 Ss.02 详解四类SQL语句

我亲爱的对手&#xff0c;亦敌亦友&#xff0c;但我同样希望你能成功&#xff0c;与我一起&#xff0c;站在人生的山顶上 ——24.3.1 一、DDL 数据定义语言 1.DDL —— 数据库操作 查询 查询所有数据库 show databases; 查询当前数据库 select database(); 创建 create databa…

【简说八股】Nginx、GateWay、Ribbon有什么区别?

前言 在现代的微服务架构中&#xff0c;Nginx、Gateway 和 Ribbon 都是处理网络请求和服务的组件&#xff0c;但它们各自扮演的角色和提供的功能有所不同。下面我将详细解释它们之间的区别&#xff1a; Nginx Nginx 是一个高性能的 HTTP 和反向代理服务器&#xff0c;它也可…

Golang Vs Java:为您的下一个项目选择正确的工具

Java 首次出现在 1995 年&#xff0c;由 James Gosling 和 Sun Microsystems 的其他人开发的一种新编程语言。从那时起&#xff0c;Java 已成为世界上最受欢迎和广泛使用的编程语言之一。Java 的主要特点包括其面向对象的设计、健壮性、平台独立性、自动内存管理以及广泛的内置…

MSMFN

CDFI是彩色多普勒血流成像 辅助信息 作者未提供数据

Codeforces Round 930 (Div. 2)

substr时间复杂度O&#xff08;N&#xff09;&#xff0c;不能一遍遍找&#xff0c;会超时 #include<iostream> #include<algorithm> #include<vector> #include<map> using namespace std; const int N5e510; map<string,int>mp; vector<…

[C++]AVL树怎么转

AVL树是啥 一提到AVL树&#xff0c;脑子里不是旋了&#xff0c;就是悬了。 AVL树之所以难&#xff0c;并不是因为结构难以理解&#xff0c;而是因为他的旋转。 AVL树定义 平衡因子&#xff1a;对于一颗二叉树&#xff0c;某节点的左右子树高度之差&#xff0c;就是该节点的…

5、云原生安全之falco的规则解读(部分)(上)

文章目录 1、自定义规则测试1.1、自定义检测定时任务的规则2、自带规则详解部分2.1、意外的出站连接源(类似的还有入站连接)2.2、检测目录穿越攻击2.3、rpm数据库被修改2.4、数据库派生新的进程2.5、特权容器启动2.6、启动容器挂载到敏感路径2.7、匹配所有在pod内启动、并连接…

音视频数字化(数字与模拟-照相机)

目录 1、模拟/数字 2、第一台照相机 3、照相机原理 4、取景方式 5、底片 6、数码相机 7、数码相机指标 8、数码相机分类 (1)单反相机 (2)单电相机 (3)无反相机

2024.03.02蓝桥云课笔记

1.scanf与printf取消分隔符的限制方法 示例代码&#xff1a; int main() { char s[10];scanf("%d[^\n]",s);printf("%s",s);return 0; } 运行&#xff1a; 输入&#xff1a;Hello World 输出&#xff1a;Hello World 注&#xff1a;其中[]中是一个正则…

(UE4升级UE5)Selected Level Actor节点升级到UE5

本问所用工具为&#xff1a;AssetDeveTool虚幻开发常用工具https://gf.bilibili.com/item/detail/1104960041 在UE4中 编辑器蓝图有个节点为 Get Selected Level Actors 但在UE5中&#xff0c;蓝图直接升级后&#xff0c;节点失效&#xff0c;如图&#xff1a; 因为在UE5中&am…

Vue3中Vuex状态管理库学习笔记

1.什么是状态管理 在开发中&#xff0c;我们会的应用程序需要处理各种各样的数据&#xff0c;这些数据需要保存在我们应用程序的某个位置&#xff0c;对于这些数据的管理我们就称之为状态管理。 在之前我们如何管理自己的状态呢&#xff1f; 在Vue开发中&#xff0c;我们使用…

大厂面试经验:如何对加密后的数据进行模糊查询操作

加密后的数据对模糊查询不是很友好&#xff0c;本篇就针对加密数据模糊查询这个问题来展开讲一讲实现的思路。 为了数据安全我们在开发过程中经常会对重要的数据进行加密存储&#xff0c;常见的有&#xff1a;密码、手机号、电话号码、详细地址、银行卡号、信用卡验证码等信息…

YoloV5改进策略:主干网络改进|MogaNet——高效的多阶门控聚合网络

文章目录 摘要论文:《MogaNet——高效的多阶门控聚合网络》1、简介2、相关工作2.1、视觉Transformers2.2、ViT时代的卷积网络3、从多阶博弈论交互的角度看表示瓶颈4、方法论4.1、MogaNet概述4.2、多阶门控聚合4.3、通过通道聚合进行多阶特征重新分配4.4、实现细节5、实验5.1、…