| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | 
							- // ignore_for_file: constant_identifier_names, non_constant_identifier_names
 
- import 'package:flutter/material.dart';
 
- import 'package:maxkey_flutter/totp.dart';
 
- import 'package:shared_preferences/shared_preferences.dart';
 
- class MaxKeyPersistent {
 
-   static const String _CURR_USER_KEY = "CurrUser";
 
-   static const String _THEME_MODE_KEY = "ThemeMode";
 
-   /// 和用户绑定
 
-   String get _TOKEN_KEY => "$_currUser.Token";
 
-   /// 不和用户绑定
 
-   static const String _HOST_KEY = "Host";
 
-   static const String _DEFAULT_HOST = "192.168.1.66";
 
-   /// 和用户绑定
 
-   String get _TOTP_LIST_KEY => "$_currUser.TotpList";
 
-   /// must call [init] first
 
-   static final MaxKeyPersistent instance = MaxKeyPersistent();
 
-   late SharedPreferences _sp;
 
-   static Future<void> init() async {
 
-     instance._sp = await SharedPreferences.getInstance();
 
-     instance._readTotps();
 
-   }
 
-   ThemeMode get themeMode => switch (_sp.getString(_THEME_MODE_KEY)) {
 
-         "light" => ThemeMode.light,
 
-         "dark" => ThemeMode.dark,
 
-         _ => ThemeMode.system,
 
-       };
 
-   late ValueNotifier<ThemeMode> themeModeListenable = ValueNotifier(themeMode);
 
-   String? get _currUser => _sp.getString(_CURR_USER_KEY);
 
-   String? get token => _sp.getString(_TOKEN_KEY);
 
-   /// example: 192.168.220.26:9527
 
-   String get host => _sp.getString(_HOST_KEY) ?? _DEFAULT_HOST;
 
-   String get baseUrl => "http://$host/sign";
 
-   final List<Totp> _totps = [];
 
-   void _readTotps() {
 
-     final totpUris = _sp.getStringList(_TOTP_LIST_KEY);
 
-     if (totpUris == null) return;
 
-     for (final uri in totpUris) {
 
-       final parsed = Totp.fromUri(uri);
 
-       if (parsed == null) continue;
 
-       _totps.add(parsed);
 
-     }
 
-   }
 
-   List<Totp> get totps => _totps;
 
-   Future<bool> setThemeMode(ThemeMode themeMode) {
 
-     themeModeListenable.value = themeMode;
 
-     return _sp.setString(_THEME_MODE_KEY, themeMode.name);
 
-   }
 
-   Future<bool> setUser(String username) async {
 
-     final result = await _sp.setString(_CURR_USER_KEY, username);
 
-     _totps.clear();
 
-     if (result) {
 
-       instance._readTotps();
 
-     }
 
-     return result;
 
-   }
 
-   Future<bool> setToken(String token) => _sp.setString(_TOKEN_KEY, token);
 
-   /// example: 192.168.220.26:9527
 
-   Future<bool> setHost(String host) => _sp.setString(_HOST_KEY, host);
 
-   Future<bool> saveTotps(List<Totp> totps) => _sp.setStringList(
 
-         _TOTP_LIST_KEY,
 
-         List.generate(totps.length, (i) => totps[i].uri),
 
-       );
 
-   Future<bool> clearToken() => _sp.remove(_TOKEN_KEY);
 
- }
 
 
  |