import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../../shared/utils/lru_eviction.dart'; mixin SettingsPersistence { SharedPreferences? _prefs; Future getPrefs() async { return _prefs ??= await SharedPreferences.getInstance(); } Future persistField(String key, dynamic value) async { try { final p = await getPrefs(); if (value == null) return p.remove(key); if (value is bool) return p.setBool(key, value); if (value is int) return p.setInt(key, value); if (value is double) return p.setDouble(key, value); if (value is String) return p.setString(key, value); if (value is List) return p.setStringList(key, value); return false; } catch (e) { debugPrint('[SettingsPersistence] Failed to persist $key: $e'); return false; } } Future persistFields(Map fields) async { try { final p = await getPrefs(); final futures = >[]; for (final entry in fields.entries) { final key = entry.key; final value = entry.value; if (value == null) { futures.add(p.remove(key)); } else if (value is bool) { futures.add(p.setBool(key, value)); } else if (value is int) { futures.add(p.setInt(key, value)); } else if (value is double) { futures.add(p.setDouble(key, value)); } else if (value is String) { futures.add(p.setString(key, value)); } else if (value is List) { futures.add(p.setStringList(key, value)); } } await Future.wait(futures); return true; } catch (e) { debugPrint('[SettingsPersistence] Failed to persist fields: $e'); return false; } } Future putRemembered( String prefsKey, String entryKey, Map entryJson, int maxEntries, ) async { final p = await getPrefs(); final raw = p.getString(prefsKey); final map = raw != null ? (jsonDecode(raw) as Map) : {}; map[entryKey] = entryJson; evictOldestEntries(map, maxEntries); await p.setString(prefsKey, jsonEncode(map)); } Future?> readRemembered( String prefsKey, String entryKey, ) async { final raw = (await getPrefs()).getString(prefsKey); if (raw == null) return null; final entry = (jsonDecode(raw) as Map)[entryKey]; return entry is Map ? entry : null; } }