added persisted app settings
Some checks failed
Flutter APK Build / Build Flutter APK (pull_request) Has been cancelled

This commit is contained in:
2026-01-23 18:03:46 +01:00
parent cad43c7664
commit 83bfdf322b
5 changed files with 143 additions and 32 deletions

View File

@@ -14,21 +14,10 @@ class JsonFileService {
required List<Bookmark> bookmarks,
}) async {
try {
final dir = await _directoryPath;
final dir = await selectDirectoryPath();
if (dir.isEmpty) return false;
final data = {
'collections': collections.map((c) => c.toJson()).toList(),
'bookmarks': bookmarks.map((b) => b.toJson()).toList(),
};
final json = jsonEncode(data).codeUnits;
final file = XFile.fromData(
Uint8List.fromList(json),
mimeType: 'application/json',
name: constants.jsonFileName,
);
file.saveTo('$dir/${constants.jsonFileName}');
saveDataToFile(collections, bookmarks, dir);
} catch (e) {
return false;
}
@@ -65,7 +54,31 @@ class JsonFileService {
}
}
static Future<String> get _directoryPath async {
static Future<bool> saveDataToFile(
List<Collection> collections,
List<Bookmark> bookmarks,
String directory,
) async {
try {
final data = jsonEncode({
'collections': collections.map((c) => c.toJson()).toList(),
'bookmarks': bookmarks.map((b) => b.toJson()).toList(),
}).codeUnits;
final file = XFile.fromData(
Uint8List.fromList(data),
mimeType: 'application/json',
name: constants.jsonFileName,
);
file.saveTo('$directory/${constants.jsonFileName}');
} catch (e) {
return false;
}
return true;
}
static Future<String> selectDirectoryPath() async {
if (Platform.isAndroid) {
return await getDirectoryPath(
initialDirectory: constants.defaultAndroidExportDirectory,

View File

@@ -12,9 +12,13 @@ class SettingsProvider extends ChangeNotifier {
void setExportDirectoryPath(String path, {bool silent = false}) {
_settings = _settings.copyWith(exportDirectoryPath: path);
_saveSettings();
Storage.saveSettings(_settings);
if (!silent) notifyListeners();
}
void _saveSettings() => Storage.saveSettings(_settings);
void setAlwaysExportEnabled(bool enabled, {bool silent = false}) {
_settings = _settings.copyWith(alwaysExportEnabled: enabled);
Storage.saveSettings(_settings);
if (!silent) notifyListeners();
}
}

View File

@@ -13,6 +13,7 @@ class Storage {
static SharedPreferencesWithCache? _prefsWithCache;
static const String _settingsKey = 'settings';
static const String _statsKey = 'stats';
static Settings _currentSettings = Settings.defaults();
static Future<void> initialize() async {
_prefsWithCache = await SharedPreferencesWithCache.create(
@@ -31,7 +32,8 @@ class Storage {
final jsonString = _prefs.getString(_settingsKey);
if (jsonString != null) {
final json = jsonDecode(jsonString) as Map<String, dynamic>;
return Settings.fromJson(json);
_currentSettings = Settings.fromJson(json);
return _currentSettings;
} else {
final settings = Settings.defaults();
saveSettings(settings);
@@ -41,6 +43,7 @@ class Storage {
static Future<void> saveSettings(Settings settings) {
final json = jsonEncode(settings.toJson());
_currentSettings = settings;
return _prefs.setString(_settingsKey, json);
}
@@ -63,11 +66,13 @@ class Storage {
static Future<void> saveCollections(List<Collection> collections) async {
final jsonList = collections.map((c) => c.toJson()).toList();
await _prefs.setString(_collectionsKey, jsonEncode(jsonList));
if (_currentSettings.alwaysExportEnabled) saveDataToFile();
}
static Future<void> saveBookmarks(List<Bookmark> bookmarks) async {
final jsonList = bookmarks.map((b) => b.toJson()).toList();
await _prefs.setString(_bookmarksKey, jsonEncode(jsonList));
if (_currentSettings.alwaysExportEnabled) saveDataToFile();
}
static List<Bookmark> loadBookmarksForCollection(int collectionId) {
@@ -196,6 +201,15 @@ class Storage {
return false;
}
static Future<String> selectDirectoryPath() =>
JsonFileService.selectDirectoryPath();
static Future<bool> saveDataToFile() => JsonFileService.saveDataToFile(
loadCollections(),
loadBookmarks(),
_currentSettings.exportDirectoryPath,
);
static SharedPreferencesWithCache get _prefs {
if (_prefsWithCache == null) {
throw StateError(