Flutter shared_preferences 各种基础用法和特别技巧

前言

在原生的andriod 和iOS 里面都会有数据缓存的api Android 端用的是 Sharedpreferences 来实现对于轻量级数据的缓存 , IOS端 通常使用NSUserDefaults 来实现轻量级数据的缓存 但是在flutter 有基于Android iOS 做支持的三方插件库 shared_preferences

准备工作

shared_preferences: ^0.5.3+4 (缓存数据)


QQ截图20201108114954.png

在项目里面的pubspec.yaml 添加依赖 然后在项目根目录打开控制台输入 flutter pub get 命令回去下载相对应的依赖

具体实现 :

QQ截图20201108115244.png

QQ20200906-141737.png

QQ20200906-141839.png

QQ20200906-141907.png

今天主要讲的内容是其他博主都讲到的 Sharedpreferences 的基础用法 以及 其他博主没有讲到的Sharedpreferences 使用技巧:

Sharedpreferences 基本用法

存储基本数据类型:
int 类型

  onPressed: ()async{
                SharedPreferences prefs = await SharedPreferences.getInstance();
                int counter =  1;
                await prefs.setInt('counter', counter);
              },

String类型

  onPressed: ()async{
                SharedPreferences prefs = await SharedPreferences.getInstance();
                String  counter =  "1";
                await prefs.setString('counter', counter);
              },

bool类型

  onPressed: ()async{
                SharedPreferences prefs = await SharedPreferences.getInstance();
                bool counter =false;
                await prefs.setBool('counter', counter);
              },

double类型

  onPressed: ()async{
                SharedPreferences prefs = await SharedPreferences.getInstance();
                double counter =0.01;
                await prefs.setDouble('counter', counter);
              },

list<String>data类型

   onPressed: ()async{
                SharedPreferences prefs = await SharedPreferences.getInstance();
                List<String>counter=["1","2"];
                await prefs.setStringList('counter', counter);
              },

取值基本用法

 onPressed: ()async{
                SharedPreferences prefs = await SharedPreferences.getInstance();
                 int  counterint =prefs.getInt("counter");
                 String  counter =prefs.getString("counter");
                 bool  counterbool =prefs.getBool("counter");
                double  counterdouble =prefs.getDouble("counter");
                List  counterlist =prefs.getStringList("counter");
              },

删除指定数据

其中key就是你存贮的名称,value就是你存储的值

 SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.remove(key); //删除指定键

清空整个缓存:

 SharedPreferences prefs = await SharedPreferences.getInstance();
 prefs.clear();//清空键值对

以上是Sharedpreferences 的基础用法 ,但是我们发现没有每次写一大推重复代码 这时候我们就对Sharedpreferences 进行简单封装是我们减少重复代码的编写

  /***
   *
   * 存数据
   */

  static Object savePreference(BuildContext context , String key , Object value) async {
   SharedPreferences prefs = await SharedPreferences.getInstance();
   if(value is  int ){
     await prefs.setInt(key, value);
     }else if(value is double){
     await prefs.setDouble(key, value);
     }else if(value is bool){
     await prefs.setBool(key, value);
     }else if(value is String){
     await prefs.setString(key, value);
     }else if(value is List){
     await prefs.setStringList(key, value);
   }  else {
     throw new Exception("不能得到这种类型");
   }
 }
  /***
   * 取数据
   *
   */
     static Future  getPreference( Object context , String key ,Object defaultValue) async{
   SharedPreferences prefs = await SharedPreferences.getInstance();
   if(defaultValue is  int) {
     return prefs.getInt(key);
      }
   else if(defaultValue is  double) {
     return prefs.getDouble(key);
      }
   else if(defaultValue is bool) {
     return prefs.getBool(key);
     }
   else if(defaultValue is String) {
     return prefs.getString(key);
   }
   else if(defaultValue is List) {
     return prefs.getStringList(key);
     }
   else {
     throw new Exception("不能得到这种类型");
   }
 }
  /***
   * 删除指定数据
   */
  static void    remove(String key)async{
     SharedPreferences prefs = await SharedPreferences.getInstance();
     prefs.remove(key); //删除指定键
   }
  /***
   * 清空整个缓存
   */
  static void    clear()async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.clear(); ////清空缓存
  }

工具类具体调用 :

存储数据:
  onPressed: (){
                String counter  = "1";
                SharedPreferencesUtils.savePreference(context, "counter", counter);
              },
            ),
取值

直接调用并赋值给定义的变量

 onPressed: ()async{
      String  counter = await (SharedPreferencesUtils.getPreference(context, "counter", "1")) as String ;
                 print("counter  -- > "+counter);
     },

通过then方式调用

 onPressed: ()async{
                 SharedPreferencesUtils.getPreference(context, "counter", "1").then((value){
                   print("value   --->"  +value);
                 });
              },

删除指定key的缓存数据调用:

   SharedPreferencesUtils.remove("counter");

清空整个SharedPreferences缓存:

   SharedPreferencesUtils.clear();

基本数据类型的封装使用我们就说完了 大家发现没有有时候我们需要存一个model其实
SharedPreferences 本身是不支持我们要怎么做


image.png

image.png

如上图是我们需要把用户名和密码起来保存 我们用传统 SharedPreferences 来做肯定不OK 当然有同学肯定想到说用 sqlite 本地数据库来实现 ,sqlite 确实可以实现 但是本身代码就多不够灵活 而且我们这边存储的字段并不多 我们这边选择在 SharedPreferences 上面做稍微的改造就能实现上面的需求的

之前的实现方式 :
     onPressed: ()async{
                      User user=new User();
                      user.username=_username;
                      user.password=_password;
                      datalsit.add(user);
                       String jsonStringA = jsonEncode(datalsit);
                      print("jsonStringA   --------- >"+ jsonStringA);
                      SharedPreferences prefs = await SharedPreferences.getInstance();
                      prefs.setString("data",jsonStringA);
                    },

取值转换

    onPressed: ()async{
                      SharedPreferences prefs = await SharedPreferences.getInstance();
                      getdata = await prefs.getString("data");
                     List  list= json.decode(getdata);
                    },

获取到值以后我们要通过 json.decode 将那倒json字符串转成list然后再来取值,这是我们传统的做法 代码量其实很大 而且如果我们有很多类似的数据要存储肯定做法不够简洁 我们这里也对于之前实现方式简单的封装 代码如下


  /**
   * 存储  List<Object> phoneList
   *
   * List<Object> phoneList
   */
  static void setSelectBeanList(BuildContext context,List<Object> phoneList, String key) async{
    String jsonStringA = jsonEncode(phoneList);
    print("jsonStringA   --------- >"+ jsonStringA);
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setString(key,jsonStringA);
  }

  /**
   * 获取  List<Object> phoneList
   *
   * List<Object> phoneList
   */
   static Future   getSelectBean(BuildContext context, String key) async {
     SharedPreferences prefs = await SharedPreferences.getInstance();
     String  getdata = await prefs.getString("data");
      List  list= json.decode(getdata);
     return list;
  }

具体调用:

存储model:
   onPressed: ()async{
                      User user=new User();
                      user.username=_username;
                      user.password=_password;
                      _userlsit.add(user);
                       SharedPreferencesUtils.setSelectBeanList(context, _userlsit, "data");
                    },
取值:
onPressed: ()async{
     List datalist= await SharedPreferencesUtils.getSelectBean(context, "data");
    },

到此整个 SharedPreferences库 数据存储的基础用法和特别技巧我们就讲完了。

最后总结:

通过这一期的博客讲解 我希望同学能能够灵活运用 SharedPreferences库来处理实战开发中的各种数据的缓存,以及使用 SharedPreferences的简单封装来简化代码和存储SharedPreferences库本身不支持的数据类型的操作 ,代码相对简单 有兴趣的同学可以下载完整代码来多尝试,最后希望我的文章能帮助到各位解决问题 ,以后我还会贡献更多有用的代码分享给大家。各位同学如果觉得文章还不错 ,麻烦给关注和star,小弟在这里谢过啦

项目地址:

码云 :https://gitee.com/qiuyu123/fluttercachedemo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容