[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';
import 'package:app_teleprompter/support/extension/object_extension.dart';

/// 管理SharedPreferences的键和值。
class SharedPreferencesManager {
  // 单例对象
  static final SharedPreferencesManager _instance = SharedPreferencesManager._internal();
  // SharedPreferences的实例
  late final Future<SharedPreferences> _prefsFuture;

  // 私有构造函数,用于创建类的单例实例
  SharedPreferencesManager._internal() {
    _prefsFuture = _init();
  }

  // 异步初始化,确保在使用SharedPreferences之前已完成初始化
  Future<SharedPreferences> _init() async {
    return SharedPreferences.getInstance();
  }

  // 提供一个getter来获取单例对象
  static SharedPreferencesManager get instance => _instance;

  // 使用泛型方法来获取键对应的值。
  // 根据泛型参数T的类型,决定使用哪个SharedPreferences的getter方法。
  Future<T?> get<T>(SharedPreferencesKey key) async {
    final SharedPreferences prefs = await _prefsFuture; // 等待初始化完成
    String keyString = key.toString();
    // 尝试获取值,如果不存在则返回null
    Object? value;
    if (T == String) {
      value = prefs.getString(keyString) as T?;
    } else if (T == bool) {
      value = prefs.getBool(keyString) as T?;
    } else if (T == int) {
      value = prefs.getInt(keyString) as T?;
    } else if (T == double) {
      value = prefs.getDouble(keyString) as T?;
    } else if (T == List) {
      // 特别注意:我们假设List类型指的是List<String>
      value = prefs.getStringList(keyString) as T?;
    } else {
      // 如果类型不支持,则抛出异常
      //throw Exception('Unsupported type');
    }
    // 如果找不到值,则返回null,否则返回值
    return value as T?;
  }

  // 使用泛型方法设置值
  Future<bool> set<T>(SharedPreferencesKey key, T value) async {
    final SharedPreferences prefs = await _prefsFuture; // 等待初始化完成
    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');
      return false;
    }
  }
}

// MARK: 自定义方法
extension PrintHelperExtension on SharedPreferencesManager {}

/// 定义一个枚举,包含所有keys和它们对应的类型
enum SharedPreferencesKey {
  didGuide(bool), // 引导状态的键,与布尔类型关联
  isSubscribeValid(bool), // 订阅是否有效
  themeMode(String);

  // 存储枚举值关联的类型
  final Type type;
  // 枚举构造函数
  const SharedPreferencesKey(this.type);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

案例介绍:汽车维修系统的信息抽取技术与数据治理应用(开源)

一、引言 在当今汽车产业的快速发展中&#xff0c;软件已经成为提升车辆性能、安全性和用户体验的关键因素。从车载操作系统到智能驾驶辅助系统&#xff0c;软件技术的进步正在重塑我们对汽车的传统认知。我有幸参与了一个创新项目&#xff0c;该项目专注于开发和集成先进的汽…

每日一题 — 盛水最多的容器

11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 因为体积是长度乘高&#xff0c;所以运用双指针&#xff0c;一个在最左&#xff0c;一个在最右&#xff0c;每次都记录体积 V &#xff0c;然后比较左边的长度和右边的长度&#xff0c;左边的长度…

浅析扩散模型与图像生成【应用篇】(五)——SDEdit

5. SDEdit: Guided Image Synthesis and Editing With Stochastic Differential Equations 该文提出一种基于SDE扩散模型的引导图像生成和编辑方法。通过使用者在原图上给出一些引导&#xff0c;比如在图像上涂鸦或者增加一个图块&#xff0c;甚至可以不给定原图&#xff0c;直…

图像剪辑|Linux|ImageMagick的初步使用--素描,毛玻璃等特效

前言&#xff1a; ImageMagick在图像剪辑领域的地位基本等同于FFmpeg&#xff0c;和FFmpeg基本一样&#xff0c;在Linux下使用此工具的原因是该工具可以使用shell脚本批量剪辑&#xff0c;在Windows下就会比较麻烦一些了 那么&#xff0c;本文主要是记录一下ImageMagick的一些…

简单聊聊http协议头参数之Content-Type和http状态码 415错误

大家好&#xff0c;我是G探险者。 今天聊一下http的状态码&#xff0c;415错误&#xff0c;因为项目里面使用了httpclient进行了远程服务调用&#xff0c;调用发送时&#xff0c;会有一个http header的参数设置。由于参数设置的问题经常会出现错误&#xff0c;导致调用失败&am…

基于51单片机微波炉简易控制仿真设计数码管显示proteus仿真+程序+设计报告+讲解视频)

基于51单片机微波炉简易控制仿真设计数码管显示 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真4. 程序代码延时函数定时器初始化定时器中断产生PWM显示函数 5. 设计报告6. 设计资料内容清单&&下载链接资料下载链接&#xff1a; 基于51单片机微波炉简易控制仿…

xfce任务栏图标挤到一起了

分隔符&#xff0c;扩展&#xff0c;撑开任务栏

2024东南大学553复试真题及笔记

2023年真题知识点 引用指针 题目为 传递一个指针的引用做修改&#xff0c;输出指针指向的结果&#xff0c;但是指针被修改&#xff0c;结果就不一样了。 static 静态变量 类里面的静态成员变量&#xff0c;很简单的题目 for循环 看循环的内容输出字符串 try try catch捕…

Launch学习

参考博客&#xff1a; (1) 史上最全的launch的解析来啦&#xff0c;木有之一欧 1 ROS工作空间简介 2 元功能包 src目录下可以包含多个功能包&#xff0c;假设需要使用机器人导航模块&#xff0c;但是这个模块中包含着地图、定位、路径规划等不同的功能包&#xff0c;它们的逻…

Vue3和ElementPlus封装table组件

最近学习vue3.2并自己在写一个项目&#xff0c;然后发现好几个页面都是列表页&#xff0c;重复写table和column也是觉得累&#xff0c;学习的项目列表页不算多&#xff0c;要是公司项目就不一样了&#xff0c;所以就想着自己封装一个table组件&#xff0c;免去大量重复工作和co…

Acwing---1497. 树的遍历

树的遍历 1.题目2.基本思想3.代码实现 1.题目 一个二叉树&#xff0c;树中每个节点的权值互不相同。 现在给出它的后序遍历和中序遍历&#xff0c;请你输出它的层序遍历。 输入格式 第一行包含整数 N&#xff0c;表示二叉树的节点数。 第二行包含 N个整数&#xff0c;表示二…

Javase-类与对象

文章目录 一 . 面向过程的初步认知二 . 如何创建一个类三 . 如何创建一个对象四 . this引用五 . 构造方法六 . 初始化 一 . 面向过程的初步认知 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对…

使用Android Native Hook技术解决VLC播放器闪退的问题

文章目录 1.概述2.问题描述3.问题分析4.问题解决5.总结 1.概述 在做公司的一个TOB的需求时&#xff0c;发现调起Unity提供的3D播放器播放网络在线视频时闪退了&#xff0c;然后就拉着相关部门的人一起分析问题&#xff0c;最后定位到是VLC里面用到的系统日志打印函数在部分的系…

Flask入门二(Flask的CBV、模版语法、请求和响应、session执行流程分析、Flask闪现、请求拓展、g对象)

文章目录 一、Flask的CBV1.CBV的写法2.CBV的执行流程3.endpoint 的使用4.CBV中得methods作用5.CBV加装饰器 二、模版语法1.渲染变量2.变量的循环3.逻辑判断 三、请求和响应四、session执行流程分析1.基本使用2.执行流程3.Django中session的执行流程 五、Flask闪现1.作用2.案例3…

【Unity】Node.js安装与配置环境

引言 我们在使用unity开发的时候&#xff0c;有时候会使用一些辅助工具。 Node.js就是开发中&#xff0c;经常会遇到的一款软件。 1.下载Node.js 下载地址&#xff1a;https://nodejs.org/en 2.安装Node.js ①点击直接点击Next下一步 ②把协议勾上&#xff0c;继续点击…

【论文精读】I-JEPA

摘要 计算机视觉中&#xff0c;常采用基于不变性和基于生成的方法进行自监督学习。对比学习&#xff08;CL&#xff09;是典型的基于不变性的方法&#xff0c;通过预训练方法优化编码器&#xff0c;使其能生成同一图像的两个或多个视图的相似嵌入&#xff0c;其中图像视图通常由…

格两例12345

osu/Lucky Roll gaming 周末osu有道题&#xff1a;lcg已知低位 def lcg(s, a, b, p):return (a * s b) % pp getPrime(floor(72.7)) a randrange(0, p) b randrange(0, p) seed randrange(0, p) print(f"{p }") print(f"{a }") print(f"{b …

关于python函数参数传递

参数传递 在 python 中&#xff0c;类型属于对象&#xff0c;对象有不同类型的区分&#xff0c;变量是没有类型的&#xff1a; 在下面的代码示例重&#xff0c;[1,2,3] 是 List 类型&#xff0c;“qayrup” 是 String 类型&#xff0c;而变量 a 是没有类型&#xff0c;它仅仅…

java找工作之Mybatis(入门及xml配置相关)

Mybatis 学习Mybatis就要学会查看官网&#xff0c;官网地址如下&#xff1a;<MyBatis中文网 > 1、简介 1.1什么是Mybatis MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取…

图形系统开发实战课程:进阶篇(上)——9.空间算法(一)

图形开发学院&#xff5c;GraphAnyWhere 课程名称&#xff1a;图形系统开发实战课程&#xff1a;进阶篇(上)课程章节&#xff1a;“图形样式”原文地址&#xff1a;https://www.graphanywhere.com/graph/advanced/2-9.html 第九章 空间算法&#xff08;一&#xff09; \quad 在…
最新文章