当前位置:   article > 正文

flutter使用shared_preferences依赖库实现简单的本地数据存储,封装成一个简单的单例类,方便前端同学使用_flutter shared_preferences的封装

flutter shared_preferences的封装

shared_preferences 仓库地址:shared_preferences | Flutter Package

shared_preferences这个依赖库还是非常好用的,全平台支持,就像前端经常使用的localstorage一样方便,所以就想着封装成一个简单的类,方便前端同学使用。封装好的代码支持json或者数组等这种类型的存储和获取。

在utils里面新建storeage.dart,封装好的类代码是:

  1. import 'package:shared_preferences/shared_preferences.dart';
  2. import 'dart:convert';
  3. // 封装一个本地存储的类
  4. class Storage {
  5. // 静态单例模式:静态私有实例对象
  6. static Storage? _instance;
  7. // 实现工厂函数
  8. factory Storage() => _instance ?? Storage._init();
  9. /// 命名构造函数 用于初始化SharedPreferences实例对象
  10. Storage._init() {
  11. // 初始化SharedPreferences实例
  12. _initStorage();
  13. }
  14. // SharedPreferences对象
  15. static late SharedPreferences _storage;
  16. // 之所以这个没有写在 _init中,是因为SharedPreferences.getInstance是一个异步的方法 需要用await接收它的值
  17. _initStorage() async {
  18. try {
  19. _storage = await SharedPreferences.getInstance();
  20. } catch (e) {
  21. _storage = await SharedPreferences.getInstance();
  22. }
  23. }
  24. /// 设置存储
  25. setStorage(String key, dynamic value) async {
  26. await _initStorage();
  27. String type;
  28. // 监测value的类型 如果是Map和List,则转换成JSON,以字符串进行存储
  29. if (value is Map || value is List) {
  30. type = 'String';
  31. value = const JsonEncoder().convert(value);
  32. }
  33. // 否则 获取value的类型的字符串形式
  34. else {
  35. type = value.runtimeType.toString();
  36. }
  37. // 根据value不同的类型 用不同的方法进行存储
  38. switch (type) {
  39. case 'String':
  40. _storage.setString(key, value);
  41. break;
  42. case 'int':
  43. _storage.setInt(key, value);
  44. break;
  45. case 'double':
  46. _storage.setDouble(key, value);
  47. break;
  48. case 'bool':
  49. _storage.setBool(key, value);
  50. break;
  51. }
  52. }
  53. /// 获取存储 注意:返回的是一个Future对象 要么用await接收 要么在.then中接收
  54. Future<dynamic> getStorage(String key) async {
  55. await _initStorage();
  56. // 获取key对应的value
  57. dynamic value = _storage.get(key);
  58. // 判断value是不是一个json的字符串 是 则解码
  59. if (_isJson(value)) {
  60. return const JsonDecoder().convert(value);
  61. } else {
  62. // 不是 则直接返回
  63. return value;
  64. }
  65. }
  66. /// 是否包含某个key
  67. Future<bool> hasKey(String key) async {
  68. await _initStorage();
  69. return _storage.containsKey(key);
  70. }
  71. /// 删除key指向的存储 如果key存在则删除并返回true,否则返回false
  72. Future<bool> removeStorage(String key) async {
  73. await _initStorage();
  74. if (await hasKey(key)) {
  75. await _storage.remove(key);
  76. return true;
  77. } else {
  78. return false;
  79. }
  80. // return _storage.remove(key);
  81. }
  82. /// 清空存储 并总是返回true
  83. Future<bool> clear() async {
  84. await _initStorage();
  85. _storage.clear();
  86. return true;
  87. }
  88. /// 获取所有的key 类型为Set<String>
  89. Future<Set<String>> getKeys() async {
  90. await _initStorage();
  91. return _storage.getKeys();
  92. }
  93. // 判断是否是JSON字符串
  94. _isJson(dynamic value) {
  95. try {
  96. // 如果value是一个json的字符串 则不会报错 返回true
  97. const JsonDecoder().convert(value);
  98. return true;
  99. } catch (e) {
  100. // 如果value不是json的字符串 则报错 进入catch 返回false
  101. return false;
  102. }
  103. }
  104. }
  105. // 导出一个全局使用的实例
  106. // 使用的一些示例
  107. /*
  108. var ps = Storage();
  109. // 1. 存储所有类型的值
  110. ps.setStorage('Map', {"key": "value"}); // 存储Map
  111. ps.setStorage('int', 1); // 存储int
  112. ps.setStorage('double', 1.0); // 存储double
  113. ps.setStorage('bool', true); // 存储bool
  114. ps.setStorage('String', "Hello World"); // 存储String
  115. ps.setStorage('List', [1, true, 'String', 1.0]); // 存储List
  116. // 除setStorage以外 获取的方法的返回值全部都是Future类型
  117. // 因此需要使用await获取 或者 在其.then方法中获取值
  118. // 2. 根据key获取存储的值
  119. // 2.1 通过await 直接获取存储的值 注意 await只能在async方法中使用
  120. Logger().i(await ps.getStorage('Map')); // {key: value}
  121. // 2.2 在then中获取存储的值
  122. ps.getStorage('String').then((value) => Logger().i(value)); // {key: value}
  123. // 3. 根据key移除存储的值
  124. Logger().i(await ps.removeStorage("List")); // true 删除成功
  125. Logger().i(await ps.removeStorage('nothing')); // false 删除失败
  126. // 4. 是否包含某个key
  127. Logger().i(await ps.hasKey('map')); // 存在 true
  128. Logger().i(await ps.hasKey("List")); // 不存在 false
  129. // 5. 获取所有的key
  130. Logger().i(await ps.getKeys());
  131. // 6. 清空所有存储
  132. Logger().i(await ps.clear()); //一直都会返回true
  133. */

然后到组件中或者状态管理里面使用:

然后进行状态数据存储:

  1. // 减少状态管理的数值
  2. void setName(String val) {
  3. name.value = val;
  4. storage.setStorage("name", name.value);
  5. update();
  6. }

 状态数据初始化:获取storage里面的值并设置为获取到的值

  1. // 以下为周期函数
  2. @override
  3. void onInit() {
  4. print('onInit');
  5. super.onInit();
  6. storage.getStorage("name").then((value) {
  7. print("得到的存储数据是: ${value}");
  8. name.value = value.toString();
  9. });
  10. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/308789
推荐阅读
相关标签
  

闽ICP备14008679号