import 'package:fl_clash/common/common.dart'; import 'package:fl_clash/models/models.dart'; class Migration { static Migration? _instance; late int _oldVersion; Migration._internal(); final currentVersion = 1; factory Migration() { _instance ??= Migration._internal(); return _instance!; } Future migrationIfNeeded( Map? configMap, { required Future Function(MigrationData data) sync, }) async { _oldVersion = await preferences.getVersion(); if (_oldVersion == currentVersion) { try { return Config.realFromJson(configMap); } catch (_) { final isV0 = configMap?['proxiesStyle'] != null; if (isV0) { _oldVersion = 0; } else { throw 'Local data is damaged. A reset is required to fix this issue.'; } } } MigrationData data = MigrationData(configMap: configMap); if (_oldVersion == 0 && configMap != null) { final clashConfigMap = await preferences.getClashConfigMap(); if (clashConfigMap != null) { configMap['patchClashConfig'] = clashConfigMap; await preferences.clearClashConfig(); } data = await _oldToNow(configMap); } final res = await sync(data); await preferences.setVersion(currentVersion); return res; } Future _oldToNow(Map configMap) async { return await oldToNowTask(configMap); } } final migration = Migration();