From d0ec785e321cd602e6cc914317f16bbd1c64d3df Mon Sep 17 00:00:00 2001 From: Jonas Bark Date: Sun, 16 Nov 2025 10:13:37 +0100 Subject: [PATCH] remove settings file when corrupted #180 --- lib/main.dart | 11 ++++++---- lib/utils/settings/settings.dart | 37 ++++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 7bb3b37..63b0b05 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -24,8 +24,8 @@ const screenshotMode = false; void main() async { WidgetsFlutterBinding.ensureInitialized(); - await settings.init(); - runApp(const SwiftPlayApp()); + final error = await settings.init(); + runApp(SwiftPlayApp(error: error)); } enum ConnectionType { @@ -60,7 +60,8 @@ Future initializeActions(ConnectionType connectionType) async { } class SwiftPlayApp extends StatelessWidget { - const SwiftPlayApp({super.key}); + final String? error; + const SwiftPlayApp({super.key, this.error}); @override Widget build(BuildContext context) { @@ -71,7 +72,9 @@ class SwiftPlayApp extends StatelessWidget { theme: AppTheme.light, darkTheme: AppTheme.dark, themeMode: ThemeMode.system, - home: const RequirementsPage(), + home: error != null + ? Text('There was an error starting the App. Please contact support:\n$error') + : const RequirementsPage(), ); } } diff --git a/lib/utils/settings/settings.dart b/lib/utils/settings/settings.dart index ced5e66..de9b938 100644 --- a/lib/utils/settings/settings.dart +++ b/lib/utils/settings/settings.dart @@ -1,7 +1,11 @@ import 'dart:convert'; +import 'dart:io'; import 'package:dartx/dartx.dart'; +import 'package:path/path.dart' as path; +import 'package:path_provider_windows/path_provider_windows.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:shared_preferences_windows/shared_preferences_windows.dart'; import 'package:swift_control/utils/keymap/apps/supported_app.dart'; import 'package:swift_control/utils/requirements/multi.dart'; import 'package:window_manager/window_manager.dart'; @@ -13,7 +17,7 @@ import '../keymap/apps/custom_app.dart'; class Settings { late final SharedPreferences prefs; - Future init() async { + Future init({bool retried = false}) async { try { prefs = await SharedPreferences.getInstance(); initializeActions(getLastTarget()?.connectionType ?? ConnectionType.unknown); @@ -25,9 +29,28 @@ class Settings { final app = getKeyMap(); actionHandler.init(app); - } catch (e) { - // couldn't decode, reset - await reset(); + return null; + } catch (e, s) { + if (!retried) { + if (Platform.isWindows) { + // delete settings file + final fs = SharedPreferencesWindows.instance.fs; + + final pathProvider = PathProviderWindows(); + final String? directory = await pathProvider.getApplicationSupportPath(); + if (directory == null) { + return null; + } + final String fileLocation = path.join(directory, 'shared_preferences.json'); + final file = fs.file(fileLocation); + if (await file.exists()) { + await file.delete(); + } + } + return init(retried: true); + } else { + return '$e\n$s'; + } } } @@ -193,7 +216,7 @@ class Settings { Future addIgnoredDevice(String deviceId, String deviceName) async { final ids = _getIgnoredDeviceIds(); final names = _getIgnoredDeviceNames(); - + if (!ids.contains(deviceId)) { ids.add(deviceId); names.add(deviceName); @@ -205,7 +228,7 @@ class Settings { Future removeIgnoredDevice(String deviceId) async { final ids = _getIgnoredDeviceIds(); final names = _getIgnoredDeviceNames(); - + final index = ids.indexOf(deviceId); if (index != -1) { ids.removeAt(index); @@ -218,7 +241,7 @@ class Settings { List<({String id, String name})> getIgnoredDevices() { final ids = _getIgnoredDeviceIds(); final names = _getIgnoredDeviceNames(); - + final result = <({String id, String name})>[]; for (int i = 0; i < ids.length && i < names.length; i++) { result.add((id: ids[i], name: names[i]));