shared_preferences 倉庫地址:shared_preferences | Flutter Package
shared_preferences這個依賴庫還是非常好用的,全平臺支持,就像前端經(jīng)常使用的localstorage一樣方便,所以就想著封裝成一個簡單的類,方便前端同學(xué)使用。封裝好的代碼支持json或者數(shù)組等這種類型的存儲和獲取。
在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)管理里面使用:
然后進(jìn)行狀態(tài)數(shù)據(jù)存儲:文章來源:http://www.zghlxwxcb.cn/news/detail-806887.html
// 減少狀態(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)!