Skip to content
Snippets Groups Projects
Commit 16a9792f authored by Theo Wiese's avatar Theo Wiese
Browse files

Introduce platform dependent saving

parent 5a7c5e08
No related branches found
No related tags found
No related merge requests found
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();
}
}
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');
}
}
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:io';
import 'package:path/path.dart' as path; import 'package:flutter/foundation.dart';
import 'package:path_provider/path_provider.dart';
import 'profile.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 { class SaveManager {
static const fileName = 'profile.json'; static const fileName = 'profile.json';
File? _saveFile; final SaveDestination _destination =
FutureOr<File> get saveFile async => _saveFile ??= await _getSaveFile(); kIsWeb ? SaveDestinationWeb() : SaveDestinationStandalone();
Profile? state; 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 { Future<void> save() async {
final file = await saveFile;
final jsonString = jsonEncode(state!.toJson()); final jsonString = jsonEncode(state!.toJson());
await file.writeAsString(jsonString); await _destination.save(jsonString);
print('Saved to ${file.path}');
} }
Future<Profile> _load() async { 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'); print('No profile saved, creating new one');
return Profile(); return Profile();
} }
final fileContent = await file.readAsString(); final jsonContent = jsonDecode(jsonString);
final jsonContent = jsonDecode(fileContent);
print('Loading from ${file.path}');
return Profile.fromJson(jsonContent); return Profile.fromJson(jsonContent);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment