国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

flutter使用shared_preferences依賴庫實現(xiàn)簡單的本地數(shù)據(jù)存儲,封裝成一個簡單的單例類,方便前端同學(xué)使用

這篇具有很好參考價值的文章主要介紹了flutter使用shared_preferences依賴庫實現(xiàn)簡單的本地數(shù)據(jù)存儲,封裝成一個簡單的單例類,方便前端同學(xué)使用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

shared_preferences 倉庫地址:shared_preferences | Flutter Package

shared_preferences這個依賴庫還是非常好用的,全平臺支持,就像前端經(jīng)常使用的localstorage一樣方便,所以就想著封裝成一個簡單的類,方便前端同學(xué)使用。封裝好的代碼支持json或者數(shù)組等這種類型的存儲和獲取。

flutter使用shared_preferences依賴庫實現(xiàn)簡單的本地數(shù)據(jù)存儲,封裝成一個簡單的單例類,方便前端同學(xué)使用,多端開發(fā),前端

在utils里面新建storeage.dart,封裝好的類代碼是:

import 'package:shared_preferences/shared_preferences.dart';
import 'dart:convert';

// 封裝一個本地存儲的類
class Storage {
  // 靜態(tài)單例模式:靜態(tài)私有實例對象
  static Storage? _instance;

  // 實現(xiàn)工廠函數(shù)
  factory Storage() => _instance ?? Storage._init();

  /// 命名構(gòu)造函數(shù) 用于初始化SharedPreferences實例對象
  Storage._init() {
    // 初始化SharedPreferences實例
    _initStorage();
  }

  // SharedPreferences對象
  static late SharedPreferences _storage;

  // 之所以這個沒有寫在 _init中,是因為SharedPreferences.getInstance是一個異步的方法 需要用await接收它的值
  _initStorage() async {
    try {
      _storage = await SharedPreferences.getInstance();
    } catch (e) {
      _storage = await SharedPreferences.getInstance();
    }
  }

  /// 設(shè)置存儲
  setStorage(String key, dynamic value) async {
    await _initStorage();
    String type;
    // 監(jiān)測value的類型 如果是Map和List,則轉(zhuǎn)換成JSON,以字符串進(jìn)行存儲
    if (value is Map || value is List) {
      type = 'String';
      value = const JsonEncoder().convert(value);
    }
    // 否則 獲取value的類型的字符串形式
    else {
      type = value.runtimeType.toString();
    }
    // 根據(jù)value不同的類型 用不同的方法進(jìn)行存儲
    switch (type) {
      case 'String':
        _storage.setString(key, value);
        break;
      case 'int':
        _storage.setInt(key, value);
        break;
      case 'double':
        _storage.setDouble(key, value);
        break;
      case 'bool':
        _storage.setBool(key, value);
        break;
    }
  }

  /// 獲取存儲 注意:返回的是一個Future對象 要么用await接收 要么在.then中接收
  Future<dynamic> getStorage(String key) async {
    await _initStorage();
    // 獲取key對應(yīng)的value
    dynamic value = _storage.get(key);
    // 判斷value是不是一個json的字符串 是 則解碼
    if (_isJson(value)) {
      return const JsonDecoder().convert(value);
    } else {
      // 不是 則直接返回
      return value;
    }
  }

  /// 是否包含某個key
  Future<bool> hasKey(String key) async {
    await _initStorage();
    return _storage.containsKey(key);
  }

  /// 刪除key指向的存儲 如果key存在則刪除并返回true,否則返回false
  Future<bool> removeStorage(String key) async {
    await _initStorage();
    if (await hasKey(key)) {
      await _storage.remove(key);
      return true;
    } else {
      return false;
    }
    // return  _storage.remove(key);
  }

  /// 清空存儲 并總是返回true
  Future<bool> clear() async {
    await _initStorage();
    _storage.clear();
    return true;
  }

  /// 獲取所有的key 類型為Set<String>
  Future<Set<String>> getKeys() async {
    await _initStorage();
    return _storage.getKeys();
  }

  // 判斷是否是JSON字符串
  _isJson(dynamic value) {
    try {
      // 如果value是一個json的字符串 則不會報錯 返回true
      const JsonDecoder().convert(value);
      return true;
    } catch (e) {
      // 如果value不是json的字符串 則報錯 進(jìn)入catch 返回false
      return false;
    }
  }
}

// 導(dǎo)出一個全局使用的實例

// 使用的一些示例
/*
  var ps = Storage();
  // 1. 存儲所有類型的值
  ps.setStorage('Map', {"key": "value"}); // 存儲Map
  ps.setStorage('int', 1); // 存儲int
  ps.setStorage('double', 1.0); // 存儲double
  ps.setStorage('bool', true); // 存儲bool
  ps.setStorage('String', "Hello World"); // 存儲String
  ps.setStorage('List', [1, true, 'String', 1.0]); // 存儲List
  // 除setStorage以外 獲取的方法的返回值全部都是Future類型
  // 因此需要使用await獲取 或者 在其.then方法中獲取值
  // 2. 根據(jù)key獲取存儲的值
  // 2.1 通過await 直接獲取存儲的值 注意 await只能在async方法中使用
  Logger().i(await ps.getStorage('Map')); // {key: value}
  // 2.2 在then中獲取存儲的值
  ps.getStorage('String').then((value) => Logger().i(value)); // {key: value}
  // 3. 根據(jù)key移除存儲的值
  Logger().i(await ps.removeStorage("List")); // true  刪除成功
  Logger().i(await ps.removeStorage('nothing')); // false 刪除失敗
  // 4. 是否包含某個key
  Logger().i(await ps.hasKey('map')); // 存在   true
  Logger().i(await ps.hasKey("List")); // 不存在 false
  // 5. 獲取所有的key
  Logger().i(await ps.getKeys());
  // 6. 清空所有存儲
  Logger().i(await ps.clear()); //一直都會返回true
*/

然后到組件中或者狀態(tài)管理里面使用:

flutter使用shared_preferences依賴庫實現(xiàn)簡單的本地數(shù)據(jù)存儲,封裝成一個簡單的單例類,方便前端同學(xué)使用,多端開發(fā),前端

然后進(jìn)行狀態(tài)數(shù)據(jù)存儲:

  // 減少狀態(tài)管理的數(shù)值
  void setName(String val) {
    name.value = val;
    storage.setStorage("name", name.value);
    update();
  }

?狀態(tài)數(shù)據(jù)初始化:獲取storage里面的值并設(shè)置為獲取到的值文章來源地址http://www.zghlxwxcb.cn/news/detail-806887.html


  // 以下為周期函數(shù)
  @override
  void onInit() {
    print('onInit');
    super.onInit();
    storage.getStorage("name").then((value) {
      print("得到的存儲數(shù)據(jù)是: ${value}");
      name.value = value.toString();
    });
  }

到了這里,關(guān)于flutter使用shared_preferences依賴庫實現(xiàn)簡單的本地數(shù)據(jù)存儲,封裝成一個簡單的單例類,方便前端同學(xué)使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Flutter依賴注入

    依賴注入(Dependency Injection,簡稱DI)是一種軟件設(shè)計模式,它的主要目的是將對象之間的依賴關(guān)系解耦,使得代碼更加可維護(hù)、可測試、可擴(kuò)展,使得代碼更易于維護(hù)和測試。在Flutter中,DI可以幫助我們管理應(yīng)用程序中的各種依賴關(guān)系,包括服務(wù)、數(shù)據(jù)存儲和UI組件等。 在

    2024年02月08日
    瀏覽(15)
  • flutter獲取地理定位:geolocator依賴詳細(xì)用法

    flutter獲取地理定位:geolocator依賴詳細(xì)用法

    ?本文使用geolocator插件實現(xiàn)app物理定位功能。 該插件的主要功能有: 獲取最后已知位置; 獲取設(shè)備當(dāng)前位置; 獲取連續(xù)的位置更新; 檢查設(shè)備是否啟用了定位服務(wù); 計算兩個地理坐標(biāo)之間的距離(米); 計算兩個地理坐標(biāo)之間的方位; ?方法一:在pubspec.yaml文件中添加它

    2024年01月20日
    瀏覽(25)
  • Flutter - 一行命令解決多個pubspec.yaml文件的依賴項問題

    Flutter - 一行命令解決多個pubspec.yaml文件的依賴項問題

    項目為了模塊化,創(chuàng)建了一堆 Package 和 Plugin ,這么做沒什么問題,但是遇到Flutter SDK目錄路徑變化或者其他一些情況導(dǎo)致需要重新獲取依賴項時就麻煩了。麻煩之處在于需要在每個 pubspec.yaml 文件所在的目錄中運(yùn)行 flutter pub get 命令,雖然也不是什么大問題,但是這種重復(fù)簡

    2024年02月08日
    瀏覽(17)
  • Flutter:安裝依賴報錯doesn‘t support null safety

    Flutter:安裝依賴報錯doesn‘t support null safety

    項目中需要引用http依賴,在pubspec.yaml文件中添加如下信息: 當(dāng)同步時,報錯信息如下: [myflutter] flutter pub upgrade Resolving dependencies... The current Dart SDK version is 3.1.3. Because myflutter depends on http =0.2.8+2 0.13.0-nullsafety.0 which doesn\\\'t support null safety, version solving failed. The lower bound of \\\"sdk:

    2024年02月04日
    瀏覽(14)
  • 使用 Spring 實現(xiàn)控制反轉(zhuǎn)和依賴注入

    在本文中,我們將介紹 IoC (控制反轉(zhuǎn))和 DI (依賴注入)的概念,以及如何在 Spring 框架中實現(xiàn)它們。 控制反轉(zhuǎn)是軟件工程中的一個原則,它將對象或程序的某些部分的控制權(quán)轉(zhuǎn)移給容器或框架。我們最常在面向?qū)ο缶幊痰纳舷挛闹惺褂盟?與傳統(tǒng)編程相比,傳統(tǒng)編程中我

    2024年02月13日
    瀏覽(18)
  • 【Flutter】Flutter 使用 fluttertoast 實現(xiàn)顯示 Toast 消息

    【Flutter】Flutter 使用 fluttertoast 實現(xiàn)顯示 Toast 消息 在這篇文章中,我將與你分享如何在 Flutter 項目中使用 fluttertoast 包來顯示 Toast 消息。 Toast 是一個簡短的、非模態(tài)的消息提示框,它可以在應(yīng)用的前端顯示,不會打斷用戶的操作。 fluttertoast 是一個非常受歡迎的 Flutter 包,用

    2024年02月06日
    瀏覽(19)
  • .Net Framework使用Autofac實現(xiàn)依賴注入

    最近也是找了快2周的工作了,收到的面試邀請也就幾個,然后有個面試題目是用asp.net mvc + Entityframework 做一個學(xué)生信息增刪改查系統(tǒng)。因為題目要求了用Entityframework 也就是EF 那也就不上core了,web項目也是用Framework 4.8去做的。 本文的重點是IOC容器,在Framework 中是沒有自帶的

    2024年02月09日
    瀏覽(17)
  • 【Flutter】Flutter 使用 table_calendar 實現(xiàn)自定義日歷

    【Flutter】Flutter 使用 table_calendar 實現(xiàn)自定義日歷 你好!今天我要為你介紹一個非常實用的 Flutter 日歷組件—— table_calendar 。這個組件不僅功能強(qiáng)大、高度可定制,而且使用起來非常簡單。在本文中,我會手把手教你如何使用這個組件,并分享一些實際業(yè)務(wù)中的應(yīng)用示例。希

    2024年02月08日
    瀏覽(32)
  • 【Flutter】Flutter 使用 fluent_ui 實現(xiàn) Windows UI

    當(dāng)然,我們將按照你的要求分批次輸出文章的正文內(nèi)容。以下是前三個章節(jié)的內(nèi)容: fluent_ui 是一個在 Flutter 中實現(xiàn) Windows UI 的包。通過使用這個包,開發(fā)者可以輕松地在 Flutter 項目中創(chuàng)建出符合 Windows UI 指南的應(yīng)用程序。本文將詳細(xì)介紹 fluent_ui 的主要特性和使用方法,幫助

    2024年02月09日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包