import 'dart:async'; import 'dart:convert'; import 'package:fl_clash/models/models.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'constant.dart'; class Preferences { static Preferences? _instance; Completer sharedPreferencesCompleter = Completer(); Future get isInit async => await sharedPreferencesCompleter.future != null; Preferences._internal() { SharedPreferences.getInstance() .then((value) => sharedPreferencesCompleter.complete(value)) .onError((_, _) => sharedPreferencesCompleter.complete(null)); } factory Preferences() { _instance ??= Preferences._internal(); return _instance!; } Future getVersion() async { final preferences = await sharedPreferencesCompleter.future; return preferences?.getInt('version') ?? 0; } Future setVersion(int version) async { final preferences = await sharedPreferencesCompleter.future; await preferences?.setInt('version', version); } Future saveShareState(SharedState shareState) async { final preferences = await sharedPreferencesCompleter.future; await preferences?.setString('sharedState', json.encode(shareState)); } Future?> getConfigMap() async { try { final preferences = await sharedPreferencesCompleter.future; final configString = preferences?.getString(configKey); if (configString == null) return null; final Map? configMap = json.decode(configString); return configMap; } catch (_) { return null; } } Future?> getClashConfigMap() async { try { final preferences = await sharedPreferencesCompleter.future; final clashConfigString = preferences?.getString(clashConfigKey); if (clashConfigString == null) return null; return json.decode(clashConfigString); } catch (_) { return null; } } Future clearClashConfig() async { try { final preferences = await sharedPreferencesCompleter.future; await preferences?.remove(clashConfigKey); return; } catch (_) { return; } } Future getConfig() async { final configMap = await getConfigMap(); if (configMap == null) { return null; } return Config.fromJson(configMap); } Future saveConfig(Config config) async { final preferences = await sharedPreferencesCompleter.future; return preferences?.setString(configKey, json.encode(config)) ?? false; } Future clearPreferences() async { final sharedPreferencesIns = await sharedPreferencesCompleter.future; await sharedPreferencesIns?.clear(); } } final preferences = Preferences();