From 6e6b9280c07086d36269d6230821b4fb278e48e8 Mon Sep 17 00:00:00 2001 From: marco Date: Fri, 12 Jun 2026 12:23:39 +0200 Subject: [PATCH] added storage class that uses shared preferences --- lib/model/repositories/local_repository.dart | 74 ++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 lib/model/repositories/local_repository.dart diff --git a/lib/model/repositories/local_repository.dart b/lib/model/repositories/local_repository.dart new file mode 100644 index 0000000..f921dd3 --- /dev/null +++ b/lib/model/repositories/local_repository.dart @@ -0,0 +1,74 @@ +import 'dart:convert'; + +import 'package:shared_preferences/shared_preferences.dart'; + +import '../task.dart'; +import 'interfaces/task_repository.dart'; + +class LocalRepository implements TaskRepository { + static const String _tasksKey = 'tasks'; + static const String _taskOrderKey = 'taskOrder'; + SharedPreferencesWithCache? _prefs; + + Future initialize() async { + if (_prefs == null) { + await SharedPreferencesWithCache.create( + cacheOptions: const SharedPreferencesWithCacheOptions( + allowList: {_tasksKey, _taskOrderKey}, + ), + ).then((value) => _prefs = value); + } + } + + // Create + + @override + Future saveTask(Task task) async { + final tasks = await loadTasks(); + if (tasks.contains(task)) { + tasks.remove(task); + } else { + final taskOrder = (await loadTaskOrder()).toList(); + taskOrder.add(task.id); + await saveTaskOrder(taskOrder); + } + tasks.add(task); + return saveTasks(tasks); + } + + @override + Future saveTasks(List tasks) async { + final jsonList = tasks.map((e) => jsonEncode(e.toJson())).toList(); + return _prefs!.setStringList(_tasksKey, jsonList); + } + + @override + Future saveTaskOrder(Iterable taskOrder) { + final jsonList = taskOrder.map((e) => jsonEncode(e)).toList(); + return _prefs!.setStringList(_taskOrderKey, jsonList); + } + + // Read + + @override + Future> loadTaskOrder() async { + final Iterable jsonList = + _prefs!.getStringList(_taskOrderKey) ?? []; + return jsonList.map((e) => jsonDecode(e)); + } + + @override + Future> loadTasks() async { + final Iterable jsonList = _prefs!.getStringList(_tasksKey) ?? []; + return jsonList.map((e) => Task.fromJson(jsonDecode(e))).toList(); + } + + // Delete + + @override + Future deleteTask(Task task) async { + final tasks = await loadTasks(); + tasks.remove(task); + saveTasks(tasks); + } +}