store.dart 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. // ignore_for_file: constant_identifier_names
  2. import 'dart:convert';
  3. import 'package:fis_common/helpers/encrypt.dart';
  4. import 'package:fis_common/logger/logger.dart';
  5. import 'package:flutter/foundation.dart';
  6. import 'package:get/get.dart';
  7. import 'package:vitalapp/store/modules/resident.dart';
  8. import 'package:vitalapp/store/modules/user.dart';
  9. import '../architecture/storage/text_storage.dart';
  10. import 'defines.dart';
  11. import 'modules/app.dart';
  12. class Store implements PersistentalbeState {
  13. /// 已注册模块名称
  14. static final Set<String> _registeredModuleNames = {};
  15. /// 文本存储文件名
  16. static const _PERSISTENCE_FILENAME = "states.dat";
  17. /// 文本存储文件名
  18. static const _PERSISTENCE_FILENAME_DEBUG = "states_debug.dat";
  19. /// 应用状态
  20. static AppState get app => _findModule<AppState>();
  21. /// 用户状态
  22. static UserState get user => _findModule<UserState>();
  23. /// 居民检测状态
  24. static ResidentState get resident => _findModule<ResidentState>();
  25. /// 全局单例
  26. static Store get ins => Get.find();
  27. /// 文本存储
  28. late final TextStorage _persistenceStorage;
  29. Store._() {
  30. const fileName =
  31. kDebugMode ? _PERSISTENCE_FILENAME_DEBUG : _PERSISTENCE_FILENAME;
  32. _persistenceStorage = TextStorage(fileName: fileName);
  33. }
  34. /// 初始化单例
  35. static Future<Store> init() async {
  36. if (Get.isRegistered<Store>()) return ins;
  37. logger.i("Store init start...");
  38. // 创建实例
  39. final instance = Store._();
  40. Get.put(instance);
  41. await Future.delayed(const Duration(milliseconds: 500));
  42. // 注册状态模块
  43. _regModuleSync(AppState());
  44. _regModuleSync(UserState());
  45. _regModuleSync(ResidentState());
  46. // 加载持久化缓存
  47. await instance._loadPersistenceData();
  48. logger.i("Store init done!");
  49. return instance;
  50. }
  51. /// 持久化
  52. static Future<bool> persistent() => ins._persistent();
  53. @override
  54. Future<void> acceptPersistenceJson(Map<String, dynamic> map) async {
  55. for (var key in map.keys) {
  56. var value = map[key];
  57. if (value != null) {
  58. logger.i('start acceptPersistenceJson by name:$key');
  59. final module = _findModuleByName(key);
  60. await module.acceptPersistenceJson(map[key]);
  61. logger.i('end acceptPersistenceJson by name:$key');
  62. }
  63. }
  64. }
  65. @override
  66. Map<String, dynamic> toPersistenceJson() {
  67. Map<String, dynamic> map = {};
  68. for (final name in _registeredModuleNames) {
  69. final module = _findModuleByName(name);
  70. map[name] = module.toPersistenceJson();
  71. }
  72. return map;
  73. }
  74. Future<void> _loadPersistenceData() async {
  75. try {
  76. var text = await _persistenceStorage.read();
  77. if (text == null || text.isEmpty) return;
  78. if (!kDebugMode && text.length > 2 && !text.startsWith('{')) {
  79. try {
  80. text = FEncryptHelper.decrypAES(text);
  81. } catch (e) {
  82. return logger.e("States load persistence data: decrypt fail.", e);
  83. }
  84. }
  85. final map = jsonDecode(text);
  86. await acceptPersistenceJson(map);
  87. } catch (e) {
  88. logger.e("States load persistence data error.", e);
  89. }
  90. }
  91. Future<bool> _persistent() async {
  92. try {
  93. final map = toPersistenceJson();
  94. var json = jsonEncode(map);
  95. if (!kDebugMode) {
  96. // 非debug模式需要加密
  97. json = FEncryptHelper.encrypAES(json);
  98. }
  99. final result = await _persistenceStorage.save(json);
  100. return result;
  101. } catch (e) {
  102. logger.e("States persistence error.", e);
  103. }
  104. return false;
  105. }
  106. static T _findModule<T extends StateModuleBase>() {
  107. final tag = T.toString();
  108. return _findModuleByName<T>(tag);
  109. }
  110. static T _findModuleByName<T extends StateModuleBase>(String name) {
  111. final module = Get.find<StateModuleBase>(tag: name) as T;
  112. return module;
  113. }
  114. static void _regModuleSync<T extends StateModuleBase>(T module) {
  115. final tag = T.toString();
  116. _registeredModuleNames.add(tag);
  117. Get.put<StateModuleBase>(module, tag: tag);
  118. }
  119. }