From 64343bbb80003b0fa2972a0c1b1d127dc0776e55 Mon Sep 17 00:00:00 2001 From: Thatsaphorn Atchariyaphap Date: Mon, 22 Sep 2025 19:34:04 +0200 Subject: [PATCH] Refactor preferences service initialization to lazy load `SharedPreferences` and make `registerDefaultServices` synchronous --- finlog_app/app/lib/main.dart | 2 +- finlog_app/fluttery/lib/fluttery.dart | 7 ++---- .../lib/src/preferences/preferences_impl.dart | 25 ++++++++++++++++--- .../lib/src/system/worker/worker_impl.dart | 2 +- .../test/preferences/preferences_test.dart | 3 +-- 5 files changed, 26 insertions(+), 13 deletions(-) diff --git a/finlog_app/app/lib/main.dart b/finlog_app/app/lib/main.dart index 91dd702..d281b62 100644 --- a/finlog_app/app/lib/main.dart +++ b/finlog_app/app/lib/main.dart @@ -9,7 +9,7 @@ Future main() async { WidgetsFlutterBinding.ensureInitialized(); // any services - await App.registerDefaultServices(); + App.registerDefaultServices(); final logger = App.service(); logger.debug("[MAIN] Registered all default services"); diff --git a/finlog_app/fluttery/lib/fluttery.dart b/finlog_app/fluttery/lib/fluttery.dart index 59a9302..e56cef1 100644 --- a/finlog_app/fluttery/lib/fluttery.dart +++ b/finlog_app/fluttery/lib/fluttery.dart @@ -9,7 +9,6 @@ import 'package:fluttery/src/storage/secure/secure_storage_impl.dart'; import 'package:fluttery/src/system/worker/worker_impl.dart'; import 'package:fluttery/worker.dart'; import 'package:kiwi/kiwi.dart'; -import 'package:shared_preferences/shared_preferences.dart'; /// A class to manage services. class App { @@ -32,11 +31,9 @@ class App { } /// Registers the default services required by the application. - static Future registerDefaultServices() async { - final prefs = await SharedPreferences.getInstance(); - + static void registerDefaultServices() { registerService(() => LoggerImpl()); - registerService(() => PreferencesImpl(instance: prefs)); + registerService(() => PreferencesImpl()); registerService(() => SecureStorageImpl()); registerService(() => WorkerImpl()); } diff --git a/finlog_app/fluttery/lib/src/preferences/preferences_impl.dart b/finlog_app/fluttery/lib/src/preferences/preferences_impl.dart index 8a34424..5b8d7b1 100644 --- a/finlog_app/fluttery/lib/src/preferences/preferences_impl.dart +++ b/finlog_app/fluttery/lib/src/preferences/preferences_impl.dart @@ -2,68 +2,85 @@ import 'package:fluttery/preferences.dart'; import 'package:shared_preferences/shared_preferences.dart'; class PreferencesImpl implements Preferences { - final SharedPreferences _prefs; + late final SharedPreferences _prefs; + bool _initialized = false; - /// Constructor - PreferencesImpl({required SharedPreferences instance}) : _prefs = instance; + Future _ensureInitialized() async { + if (!_initialized) { + _prefs = await SharedPreferences.getInstance(); + _initialized = true; + } + } @override Future setString(String key, String value) async { + await _ensureInitialized(); await _prefs.setString(key, value); } @override Future getString(String key) async { + await _ensureInitialized(); return _prefs.getString(key); } @override Future setInt(String key, int value) async { + await _ensureInitialized(); await _prefs.setInt(key, value); } @override Future getInt(String key) async { + await _ensureInitialized(); return _prefs.getInt(key); } @override Future setBool(String key, bool value) async { + await _ensureInitialized(); await _prefs.setBool(key, value); } @override Future getBool(String key) async { + await _ensureInitialized(); return _prefs.getBool(key); } @override Future setDouble(String key, double value) async { + await _ensureInitialized(); await _prefs.setDouble(key, value); } @override Future getDouble(String key) async { + await _ensureInitialized(); return _prefs.getDouble(key); } @override Future setStringList(String key, List value) async { + await _ensureInitialized(); await _prefs.setStringList(key, value); } @override Future?> getStringList(String key) async { + await _ensureInitialized(); return _prefs.getStringList(key); } @override Future remove(String key) async { + await _ensureInitialized(); await _prefs.remove(key); } @override Future clear() async { + await _ensureInitialized(); await _prefs.clear(); } -} +} \ No newline at end of file diff --git a/finlog_app/fluttery/lib/src/system/worker/worker_impl.dart b/finlog_app/fluttery/lib/src/system/worker/worker_impl.dart index 8ac8ab2..d5925a7 100644 --- a/finlog_app/fluttery/lib/src/system/worker/worker_impl.dart +++ b/finlog_app/fluttery/lib/src/system/worker/worker_impl.dart @@ -53,7 +53,7 @@ class WorkerImpl implements Worker { } // Now it's safe to touch plugins (e.g., SharedPreferences). - await App.registerDefaultServices(); + App.registerDefaultServices(); preTask?.call(); diff --git a/finlog_app/fluttery/test/preferences/preferences_test.dart b/finlog_app/fluttery/test/preferences/preferences_test.dart index 3ce409c..49fa28c 100644 --- a/finlog_app/fluttery/test/preferences/preferences_test.dart +++ b/finlog_app/fluttery/test/preferences/preferences_test.dart @@ -11,8 +11,7 @@ void main() { // Create preferences instance that will use the real SharedPreferences // but with in-memory storage for testing - final sharedInstance = await SharedPreferences.getInstance(); - preferences = PreferencesImpl(instance: sharedInstance); + preferences = PreferencesImpl(); // Give time for initialization await Future.delayed(Duration.zero);