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 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,小弟在這里謝過啦,也可以加我個人QQ/微信(1693891473)

項目地址:

碼雲 :https://gitee.com/qiuyu123/fluttercachedemo

QQ 交流群:

92437359.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM