赞
踩
shared_preferences
主要的作用是用于将数据异步持久化到磁盘,因为持久化数据只是存储到临时目录,当app删除时该存储的数据就是消失,web开发时清除浏览器存储的数据也将消失。
支持存储类型:
主要用于持久化数据,如持久化用户信息、列表数据等。
因为用户信息基本是不改变的,而在一个应用程序中常常会有多个页面需要展示用户信息,我们不可能每次都去获取接口,那么本地持久化就会变得很方便。
为了给用户更好的体验,在获取列表数据时我们常常会先展示旧数据,带给用户更好的体验,不至于一打开页面就是空白的,当我们采用持久化列表数据后,可以直接先展示本地数据,当网络数据请求回来后在进行数据更新。
我们知道每个平台持久化数据的方式都不一样,而shared_preferences
针对不同的平台封装了一个通用的类库,接下来我们看看不同平台下他们使用的库:
导入头文件
import 'package:shared_preferences/shared_preferences.dart';
获取实例对象
SharedPreferences? sharedPreferences = await SharedPreferences.getInstance();
我们可以通过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<SharedPreferencesExample> {
-
-
- 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
- ),
- ),
- ],
- ),
- ),
- );
- }
- }
- List<String> keys = sharedPreferences?.getKeys().toList() ?? [];
- print(keys);
-
- // 控制台输出
- [name, age, isTeacher, height, action]
- bool isContainKey = sharedPreferences?.containsKey("name") ?? false;
- print(isContainKey);
-
- // 控制台输出
- flutter: true
- bool isRemoveKey = await sharedPreferences?.remove("name") ?? false;
- print(isRemoveKey);
-
- // 控制台输出
- flutter: true
- bool isClearAllKey = await sharedPreferences?.clear() ?? false;
- print(isClearAllKey);
-
- // 控制台输出
- flutter: true
await sharedPreferences?.reload();
我们在使用shared_preferences
时每次都需要去获取它的实例,如果多个地方用到,那么每次都要实例化一次。这样代码的可读性差,后期的维护成本也变得很高,而且还不支持存储Map
类型,所以接下来我们对shared_preferences
来封装一个通用而且使用更简单的库。
因为我们获取的都是同一个实例,所以采用单例模式来进行封装最好,而且获取实例是异步的,所以我们在应用程序启动时先初始化,这样使用起来更加的方便。
因为我们代码都是采用了空安全,所以空安全里面有个非常重要的属性late
来延迟加载我们实例,如下.
- class JSpUtil {
-
- JSpUtil._internal();
-
- factory JSpUtil() => _instance;
-
- static late final JSpUtil _instance = JSpUtil._internal();
- }
因为采用单例模式,所以在获取唯一实例的时候我们在入口统一获取一次即可。
- static late SharedPreferences _preferences;
-
- static Future<JSpUtil> getInstance() async {
- _preferences = await SharedPreferences.getInstance();
- return _instance;
- }
- /// 根据key存储int类型
- static Future<bool> 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<bool> 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<bool> 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<bool> 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<bool> setStringList(String key, List<String> value) {
- return _preferences.setStringList(key, value);
- }
-
- /// 根据key获取字符串类型数组
- static List<String> getStringList(String key, {List<String> defaultValue = const []}) {
- return _preferences.getStringList(key) ?? defaultValue;
- }
-
- /// 根据key存储Map类型
- static Future<bool> 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);
- }
- /// 通用设置持久化数据
- static setLocalStorage<T>(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<String>":
- setStringList(key, value as List<String>);
- break;
- case "_InternalLinkedHashMap<String, String>":
- setMap(key, value as Map);
- break;
- }
- }
-
- /// 获取持久化数据
- static dynamic getLocalStorage<T>(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");
-
-
- // 获取磁盘中所有存入的key
- List<String> keys = JSpUtil.getKeys().toList();
- print(keys);
-
- // 持久化数据中是否包含某个key
- bool isContainKey = JSpUtil.containsKey("name");
- print(isContainKey);
-
- // 删除持久化数据中某个key
- bool 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
- ),
- ),
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。