From 16a9792fa743dfcec16a0be3b6ebf955b2d4df3e Mon Sep 17 00:00:00 2001 From: Theo Wiese <theo.wiese@student.reutlingen-university.de> Date: Mon, 19 May 2025 13:54:01 +0200 Subject: [PATCH] Introduce platform dependent saving --- lib/user/save_destination_standalone.dart | 48 +++++++++++++++++++++++ lib/user/save_destination_web.dart | 13 ++++++ lib/user/save_state.dart | 41 +++++++------------ 3 files changed, 75 insertions(+), 27 deletions(-) create mode 100644 lib/user/save_destination_standalone.dart create mode 100644 lib/user/save_destination_web.dart diff --git a/lib/user/save_destination_standalone.dart b/lib/user/save_destination_standalone.dart new file mode 100644 index 0000000..a3ee673 --- /dev/null +++ b/lib/user/save_destination_standalone.dart @@ -0,0 +1,48 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:path/path.dart' as path; +import 'package:path_provider/path_provider.dart'; + +import 'profile.dart'; +import 'save_state.dart'; + +class SaveDestinationStandalone with SaveDestination { + static const fileName = 'profile.json'; + + File? _saveFile; + FutureOr<File> get saveFile async => _saveFile ??= await _getSaveFile(); + + Profile? state; + + Future<Directory> _getSaveDirectory() async { + if (Platform.isWindows) { + return await getApplicationCacheDirectory(); + } + return await getApplicationDocumentsDirectory(); + } + + Future<File> _getSaveFile() async { + final directory = await _getSaveDirectory(); + return File(path.join(directory.path, fileName)); + } + + @override + Future<void> save(String content) async { + final file = await saveFile; + + await file.writeAsString(content); + print('Saved to ${file.path}'); + } + + @override + Future<String?> load() async { + final file = await saveFile; + + if (!await file.exists()) { + return null; + } + + return await file.readAsString(); + } +} diff --git a/lib/user/save_destination_web.dart b/lib/user/save_destination_web.dart new file mode 100644 index 0000000..7fa675d --- /dev/null +++ b/lib/user/save_destination_web.dart @@ -0,0 +1,13 @@ +import 'save_state.dart'; + +class SaveDestinationWeb with SaveDestination { + @override + Future<String?> load() async { + return null; + } + + @override + Future<void> save(String content) async { + print('Mock-saving $content'); + } +} diff --git a/lib/user/save_state.dart b/lib/user/save_state.dart index 0775c3b..83e7aef 100644 --- a/lib/user/save_state.dart +++ b/lib/user/save_state.dart @@ -1,52 +1,39 @@ import 'dart:async'; import 'dart:convert'; -import 'dart:io'; -import 'package:path/path.dart' as path; -import 'package:path_provider/path_provider.dart'; +import 'package:flutter/foundation.dart'; import 'profile.dart'; +import 'save_destination_standalone.dart'; +import 'save_destination_web.dart'; + +mixin SaveDestination { + Future<void> save(String content); + Future<String?> load(); +} class SaveManager { static const fileName = 'profile.json'; - File? _saveFile; - FutureOr<File> get saveFile async => _saveFile ??= await _getSaveFile(); + final SaveDestination _destination = + kIsWeb ? SaveDestinationWeb() : SaveDestinationStandalone(); Profile? state; - Future<Directory> _getSaveDirectory() async { - if (Platform.isWindows) { - return await getApplicationCacheDirectory(); - } - return await getApplicationDocumentsDirectory(); - } - - Future<File> _getSaveFile() async { - final directory = await _getSaveDirectory(); - return File(path.join(directory.path, fileName)); - } - Future<void> save() async { - final file = await saveFile; - final jsonString = jsonEncode(state!.toJson()); - await file.writeAsString(jsonString); - print('Saved to ${file.path}'); + await _destination.save(jsonString); } Future<Profile> _load() async { - final file = await saveFile; + final jsonString = await _destination.load(); - if (!await file.exists()) { + if (jsonString == null) { print('No profile saved, creating new one'); return Profile(); } - final fileContent = await file.readAsString(); - final jsonContent = jsonDecode(fileContent); - - print('Loading from ${file.path}'); + final jsonContent = jsonDecode(jsonString); return Profile.fromJson(jsonContent); } -- GitLab