iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Flutter 数据存储--shared_preferences使用详情
  • 914
分享到

Flutter 数据存储--shared_preferences使用详情

flutter本地数据存储 2023-09-30 20:09:01 914人浏览 独家记忆
摘要

1.shared_preferences介绍 shared_preferences主要的作用是用于将数据异步持久化到磁盘,因为持久化数据只是存储到临时目录,当app删除时该存储的数据就是消失,web开发时清除浏览器存储的数据也将消失。 支持

1.shared_preferences介绍

shared_preferences主要的作用是用于将数据异步持久化到磁盘,因为持久化数据只是存储到临时目录,当app删除时该存储的数据就是消失,web开发时清除浏览器存储的数据也将消失。

支持存储类型:

  • bool
  • int
  • double
  • string
  • stringList

shared_preferences应用场景

主要用于持久化数据,如持久化用户信息、列表数据等。

持久化用户信息

因为用户信息基本是不改变的,而在一个应用程序中常常会有多个页面需要展示用户信息,我们不可能每次都去获取接口,那么本地持久化就会变得很方便。

持久化列表数据

为了给用户更好的体验,在获取列表数据时我们常常会先展示旧数据,带给用户更好的体验,不至于一打开页面就是空白的,当我们采用持久化列表数据后,可以直接先展示本地数据,当网络数据请求回来后在进行数据更新。

shared_preferences使用的对应类库

我们知道每个平台持久化数据的方式都不一样,而shared_preferences针对不同的平台封装了一个通用的类库,接下来我们看看不同平台下他们使用的库:

  • iOS: NSUserDefaults
  • Android: SharedPreferences
  • Web: localStorage
  • Linux: FileSystem(保存数据到本地系统文件库中)
  • Mac OS: FileSystem(保存数据到本地系统文件库中)
  • Windows: FileSystem(保存数据到本地系统文件库中)

2.shared_preferences基本使用

导入头文件

import 'package:shared_preferences/shared_preferences.dart';

获取实例对象

SharedPreferences? sharedPreferences = await SharedPreferences.getInstance();

2.1.持久化数据的存储和读取

我们可以通过sharedPreferences的实例化对象调用对应的set方法设置持久化数据,通过get方法进行获取.

import 'package:flutter/material.dart';import 'package:shared_preferences/shared_preferences.dart';class SharedPreferencesExample extends StatefulWidget {  @override  _SharedPreferencesExampleState createState() => _SharedPreferencesExampleState();}class _SharedPreferencesExampleState extends State {  SharedPreferences? sharedPreferences;  // 设置持久化数据  void _setData() async {    // 实例化    sharedPreferences = await SharedPreferences.getInstance();    // 设置string类型    await sharedPreferences?.setString("name", "Jimi");    // 设置int类型    await sharedPreferences?.setInt("age", 18);    // 设置bool类型    await sharedPreferences?.setBool("isTeacher", true);    // 设置double类型    await sharedPreferences?.setDouble("height", 1.88);    // 设置string类型的数组    await sharedPreferences?.setStringList("action", ["吃饭", "睡觉", "打豆豆"]);    setState(() {});  }  @override  Widget build(BuildContext context) {    return Scaffold(      appBar: AppBar(        title: Text("SharedPreferences"),      ),      floatingActionButton: FloatingActionButton(        onPressed: _setData,        child: Icon(Icons.add),      ),      body: Center(        child: Column(          mainAxisAlignment: MainAxisAlignment.center,          crossAxisAlignment: CrossAxisAlignment.center,          children: [            Text("名字: ${sharedPreferences?.getString("name") ?? ""}",                 style: TextStyle(                   color: Colors.blue,                   fontSize: 20                 ),                ),            SizedBox(height: 20,),            Text("年龄: ${sharedPreferences?.getInt("age") ?? ""}",                 style: TextStyle(                   color: Colors.red,                   fontSize: 20                 ),                ),            SizedBox(height: 20,),            Text("是老师吗?: ${sharedPreferences?.getBool("isTeacher") ?? ""}",                 style: TextStyle(                   color: Colors.orange,                   fontSize: 20                 ),                ),            SizedBox(height: 20,),            Text("身高: ${sharedPreferences?.getDouble("height") ?? ""}",                 style: TextStyle(                   color: Colors.pink,                   fontSize: 20                 ),                ),            SizedBox(height: 20,),            Text("我正在: ${sharedPreferences?.getStringList("action") ?? ""}",                 style: TextStyle(                   color: Colors.purple,                   fontSize: 20                 ),                ),          ],        ),      ),    );  }}

  2.2. 获取持久化数据中所有存入的key

List keys = sharedPreferences?.geTKEys().toList() ?? [];print(keys);// 控制台输出[name, age, isTeacher, height, action]

2.3.判断持久化数据中是否包含某个key

bool isContainKey = sharedPreferences?.containsKey("name") ?? false;print(isContainKey);// 控制台输出Flutter: true

2.4.删除持久化数据中某个key

bool isRemoveKey = await sharedPreferences?.remove("name") ?? false;print(isRemoveKey);// 控制台输出flutter: true

2.5.清除所有持久化数据

bool isClearAllKey = await sharedPreferences?.clear() ?? false;print(isClearAllKey);// 控制台输出flutter: true

2.6.重新加载所有数据(仅重载运行时)

await sharedPreferences?.reload();

3.shared_preferences封装

我们在使用shared_preferences时每次都需要去获取它的实例,如果多个地方用到,那么每次都要实例化一次。这样代码的可读性差,后期的维护成本也变得很高,而且还不支持存储Map类型,所以接下来我们对shared_preferences来封装一个通用而且使用更简单的库。

使用单例模式进行shared_preferences封装

因为我们获取的都是同一个实例,所以采用单例模式来进行封装最好,而且获取实例是异步的,所以我们在应用程序启动时先初始化,这样使用起来更加的方便。

创建单例类

因为我们代码都是采用了空安全,所以空安全里面有个非常重要的属性late来延迟加载我们实例,如下.

class JSpUtil {  JSpUtil._internal();    factory JSpUtil() => _instance;  static late final jspUtil _instance = JSpUtil._internal();}

初始化shared_preferences

因为采用单例模式,所以在获取唯一实例的时候我们在入口统一获取一次即可。

static late SharedPreferences _preferences;static Future getInstance() async {  _preferences = await SharedPreferences.getInstance();  return _instance;}

封装方式一:对应get、set方法

/// 根据key存储int类型static Future setInt(String key, int value) {  return _preferences.setInt(key, value);}/// 根据key获取int类型static int? getInt(String key, {int defaultValue = 0}) {  return _preferences.getInt(key) ?? defaultValue;}/// 根据key存储double类型static Future setDouble(String key, double value) {  return _preferences.setDouble(key, value);}/// 根据key获取double类型static double? getDouble(String key, {double defaultValue = 0.0}) {  return _preferences.getDouble(key) ?? defaultValue;}/// 根据key存储字符串类型static Future setString(String key, String value) {  return _preferences.setString(key, value);}/// 根据key获取字符串类型static String? getString(String key, {String defaultValue = ""}) {  return _preferences.getString(key) ?? defaultValue;}/// 根据key存储布尔类型static Future setBool(String key, bool value) {  return _preferences.setBool(key, value);}/// 根据key获取布尔类型static bool? getBool(String key, {bool defaultValue = false}) {  return _preferences.getBool(key) ?? defaultValue;}/// 根据key存储字符串类型数组static Future setStringList(String key, List value) {  return _preferences.setStringList(key, value);}/// 根据key获取字符串类型数组static List getStringList(String key, {List defaultValue = const []}) {  return _preferences.getStringList(key) ?? defaultValue;}/// 根据key存储Map类型static Future setMap(String key, Map value) {  return _preferences.setString(key, JSON.encode(value));}/// 根据key获取Map类型static Map getMap(String key) {  String jsonStr = _preferences.getString(key) ?? "";  return jsonStr.isEmpty ? Map : json.decode(jsonStr);}

封装方式二:统一set、get方法

/// 通用设置持久化数据static setLocalStorage(String key, T value) {  String type = value.runtimeType.toString();  switch (type) {    case "String":      setString(key, value as String);      break;    case "int":      setInt(key, value as int);      break;    case "bool":      setBool(key, value as bool);      break;    case "double":      setDouble(key, value as double);      break;    case "List":      setStringList(key, value as List);      break;    case "_InternalLinkedHashMap":      setMap(key, value as Map);      break;  }}/// 获取持久化数据static dynamic getLocalStorage(String key) {  dynamic value = _preferences.get(key);  if (value.runtimeType.toString() == "String") {    if (_isJson(value)) {      return json.decode(value);    }  }  return value;}

两种封装的使用方式

// 设置String类型await JSpUtil.setString("name", "Jimi");// 设置int类型await JSpUtil.setInt("age", 18);// 设置bool类型await JSpUtil.setBool("isTeacher", true);// 设置double类型await JSpUtil.setDouble("height", 1.88);// 设置string类型的数组await JSpUtil.setStringList("action", ["吃饭", "睡觉", "打豆豆"]);// 设置Map类型await JSpUtil.setMap("weight", {"weight": 112});JSpUtil.setLocalStorage("name", "Jimi");JSpUtil.setLocalStorage("age", 18);JSpUtil.setLocalStorage("isTeacher", true);JSpUtil.setLocalStorage("height", 1.88);JSpUtil.setLocalStorage("action", ["吃饭", "睡觉", "打豆豆"]);JSpUtil.setLocalStorage("weight", {"weight": "112"});JSpUtil.getLocalStorage("name");JSpUtil.getLocalStorage("age");JSpUtil.getLocalStorage("isTeacher");JSpUtil.getLocalStorage("height");JSpUtil.getLocalStorage("action");JSpUtil.getLocalStorage("weight");// 获取磁盘中所有存入的keyList keys = JSpUtil.getKeys().toList();print(keys);// 持久化数据中是否包含某个keybool isContainKey = JSpUtil.containsKey("name");print(isContainKey);// 删除持久化数据中某个keybool isRemoveKey = await JSpUtil.remove("name");print(isRemoveKey);// 清除所有持久化数据bool isClearAllKey = await JSpUtil.clear();print(isClearAllKey);// 重新加载所有数据,仅重载运行时await JSpUtil.reload();

获取值的方式

Text("名字: ${JSpUtil.getString("name")}",     style: TextStyle(       color: Colors.blue,       fontSize: 20     ),    ),SizedBox(height: 20,),Text("年龄: ${JSpUtil.getInt("age")}",     style: TextStyle(       color: Colors.red,       fontSize: 20     ),    ),SizedBox(height: 20,),Text("是老师吗?: ${JSpUtil.getBool("isTeacher")}",     style: TextStyle(       color: Colors.orange,       fontSize: 20     ),    ),SizedBox(height: 20,),Text("身高: ${JSpUtil.getDouble("height")}",     style: TextStyle(       color: Colors.pink,       fontSize: 20     ),    ),SizedBox(height: 20,),Text("我正在: ${JSpUtil.getStringList("action")}",     style: TextStyle(       color: Colors.purple,       fontSize: 20     ),    ),

来源地址:https://blog.csdn.net/eastWind1101/article/details/127977741

--结束END--

本文标题: Flutter 数据存储--shared_preferences使用详情

本文链接: https://www.lsjlt.com/news/422022.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Flutter 数据存储--shared_preferences使用详情
    1.shared_preferences介绍 shared_preferences主要的作用是用于将数据异步持久化到磁盘,因为持久化数据只是存储到临时目录,当app删除时该存储的数据就是消失,web开发时清除浏览器存储的数据也将消失。 支持...
    99+
    2023-09-30
    flutter 本地数据存储
  • Flutter的键值存储数据库使用示例详解
    目录Flutter 键值存储数据库unqliteunqlite_flutter快速上手简单键值对存储JSON为什么你应该使用unqlite_flutter?Flutter 键值存储数...
    99+
    2022-11-13
    Flutter键值存储数据库 Flutter键值存储
  • ios开发Flutter之数据存储
    目录偏好存储sqlite创建表数据插入数据查询数据修改删除表删除数据库偏好存储 shared_preferences 类比iOS中的UserDefaults,使用方法比较简单。 地址...
    99+
    2024-04-02
  • 存储管理:优化你的存储使用情况
    优化存储使用情况的最佳实践 存储管理对于任何组织而言都是至关重要的,因为它可以优化存储使用情况,降低成本,提高性能并确保数据的安全性。通过实施以下最佳实践,企业可以充分利用其存储资源: 1. 容量规划: 容量规划涉及预测未来的存储需求并...
    99+
    2024-02-18
    存储管理 存储优化 存储成本 存储性能 数据安全性
  • 如何查看es存储数据情况
    要查看Elasticsearch(ES)存储的数据情况,可以通过以下几种方式: 使用Kibana:Kibana是一个流行的开源数...
    99+
    2024-04-09
    es
  • k8s数据存储之Volume使用示例详解
    目录一、什么是Volume二、k8s中的Volume三、k8s中常见的Volume类型四、Volume 之 EmptyDir 4.1 EmptyDir 特点4.2 Empt...
    99+
    2023-03-09
    k8s Volume使用 k8s数据存储Volume使用
  • Flutter中GetX系列六--GetxController/GetView使用详情
    1.GetxController介绍 在实际的项目开发过程中,我们不可能把UI代码、业务逻辑都放在一起处理,这样对项目的架构、代码的可读性、后期的维护将会是致命的,好在GetX为我们提供了GetxController,GetxControl...
    99+
    2023-10-01
    flutter GetxController 数据更新 事件监听 改变唯一的值 GetView使用详情
  • JavaScript本地数据存储sessionStorage与localStorage使用详解
    目录本地存储特性window.sessionStoragewindow.IocalStorage特点使用综合案例思路小案例: 在这个登录注册页面案例里,我们并没有连接数据库而是用到...
    99+
    2022-11-13
    JS sessionStorage与localStorage JS sessionStorage JS localStorage
  • MySQL中使用JSON存储数据
    1.概述: MySQL从5.7版本开始引入了对JSON数据类型的原生支持。 这个增强功能使开发人员能够直接在数据库中存储、操作和查询JSON数据。 MySQL的JSON字段为存储半结构化数据提供了更加...
    99+
    2023-08-31
    mysql json
  • SQL Server存储过程(数据库引擎)使用详解
    存储过程(数据库引擎) 一、背景知识1.1、使用存储过程的好处1.2、存储过程的类型 二、创建存储过程三、修改存储过程四、删除存储过程五、执行存储过程5.1、建议5.2、使用 Transa...
    99+
    2023-10-01
    数据库 sql 服务器 sqlserver 大数据
  • Flutter组件--TabBar使用详情(分段控制器)
    TabBar介绍   一个显示水平行选项卡的Widget。 通常创建为 AppBar 的 AppBar.bottom 部分并与 TabBarView 结合使用 在什么情况下使用TabBar 当你的app内容类别比较多的时候,我们常常会用到...
    99+
    2023-09-06
    flutter TabController TabBar 分段控制器
  • JavaScript如何使用localStorage存储数据
    本篇内容介绍了“JavaScript如何使用localStorage存储数据”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读...
    99+
    2024-04-02
  • C语言数据存储详解
    目录一、数据类型二、整型在内存中的存储1.原码、反码、补码大小端介绍三、浮点型在内存中的存储1.举一个浮点数存储的例子: 2.浮点数存储规则: 总结一、数据类型 char:字符数字类...
    99+
    2024-04-02
  • 存储API数据:使用Python或Laravel?
    在当今的数字化时代,API已经成为了数据获取和传输的主要方式。许多应用程序都需要从API中获取数据,并将其存储在本地数据库中。但是,对于开发人员来说,选择哪种语言来编写存储API数据的代码是一个很大的问题。Python和Laravel是两种...
    99+
    2023-08-27
    laravel api 存储
  • Flutter中数据库的使用教程详解
    在Flutter开发过程中,我门有时候需要对一些数据进行本地的持久化存储,使用sp文件形式虽然也能解决问题,但是有时数据量较大的时候,显然我们文件形式就不太合适了,这时候我们就需要使...
    99+
    2024-04-02
  • Discuz数据库存储路径详解
    Discuz数据库存储路径详解 Discuz是一个广受欢迎的开源论坛程序,其数据库是存储论坛所有数据的关键部分。在使用Discuz搭建论坛的过程中,了解数据库的存储路径是非常重要的。本...
    99+
    2024-03-09
    详解 discuz 数据库路径 数据丢失
  • C语言数据的存储详解
    目录数据类型的介绍整形浮点型构造类型指针类型void空类型整数在内存中的存储原反补的介绍大小端的介绍面试例题练习浮点数在内存中的存储存储规则讲解举例IEEE754的特别规定案例flo...
    99+
    2024-04-02
  • 如何使用Set和Map存储数据
    这篇文章主要讲解了“如何使用Set和Map存储数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Set和Map存储数据”吧!许多年来,程序员们一直使...
    99+
    2024-04-02
  • Docker数据存储Bind mounts怎么使用
    本篇内容主要讲解“Docker数据存储Bind mounts怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Docker数据存储Bind mounts怎么...
    99+
    2024-04-02
  • k8s数据存储之Volume如何使用
    这篇文章主要讲解了“k8s数据存储之Volume如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“k8s数据存储之Volume如何使用”吧!一、什么是Volume通过之前学习了解到,k8...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作