Skip to content

Commit f50a994

Browse files
committed
Attempt to repair/restore a broken preferences file
1 parent 623ba4a commit f50a994

File tree

1 file changed

+42
-1
lines changed

1 file changed

+42
-1
lines changed

lib/desktop/init.dart

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
2727
import 'package:local_notifier/local_notifier.dart';
2828
import 'package:logging/logging.dart';
2929
import 'package:material_symbols_icons/symbols.dart';
30+
import 'package:path/path.dart' as path;
31+
import 'package:path_provider/path_provider.dart';
32+
import 'package:path_provider_linux/path_provider_linux.dart';
33+
import 'package:path_provider_windows/path_provider_windows.dart';
3034
import 'package:screen_retriever/screen_retriever.dart';
3135
import 'package:shared_preferences/shared_preferences.dart';
3236
import 'package:window_manager/window_manager.dart';
@@ -125,7 +129,34 @@ Future<Widget> initialize(List<String> argv) async {
125129
_initLogging(args);
126130

127131
await windowManager.ensureInitialized();
128-
final prefs = await SharedPreferences.getInstance();
132+
SharedPreferences prefs;
133+
try {
134+
prefs = await SharedPreferences.getInstance();
135+
} catch (error) {
136+
// Attempt to repair the broken preferences file
137+
String? directory;
138+
if (Platform.isWindows) {
139+
PathProviderWindows pathProvider = PathProviderWindows();
140+
directory = await pathProvider.getApplicationSupportPath();
141+
} else if (Platform.isLinux) {
142+
PathProviderLinux pathProvider = PathProviderLinux();
143+
directory = await pathProvider.getApplicationSupportPath();
144+
}
145+
if (directory == null) {
146+
throw FormatException("Unable to find correct directory");
147+
}
148+
String appDataPath = path.join(directory, 'shared_preferences.json');
149+
List<int> repairedPreferences = await _repairPreferences(appDataPath);
150+
await File(appDataPath).writeAsBytes(repairedPreferences);
151+
152+
try {
153+
prefs = await SharedPreferences.getInstance();
154+
} catch (error) {
155+
// Unable to repair the preferences file, therefore delete it
156+
await File(appDataPath).delete();
157+
prefs = await SharedPreferences.getInstance();
158+
}
159+
}
129160
final windowManagerHelper = WindowManagerHelper.withPreferences(prefs);
130161
final isHidden = _getIsHidden(args, prefs);
131162

@@ -413,3 +444,13 @@ class _HelperWaiterState extends ConsumerState<_HelperWaiter> {
413444
}
414445
}
415446
}
447+
448+
Future<List<int>> _repairPreferences(String appDataPath) async {
449+
List<int> contents = await File(appDataPath).readAsBytes();
450+
var contentsGrowable = new List<int>.from(contents); // Make the list growable
451+
452+
// Remove any NUL characters
453+
contentsGrowable.removeWhere((item) => item == 0);
454+
455+
return contentsGrowable;
456+
}

0 commit comments

Comments
 (0)