Refactor preferences service initialization to lazy load SharedPreferences and make registerDefaultServices synchronous
This commit is contained in:
@@ -9,7 +9,7 @@ Future<void> main() async {
|
|||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
||||||
// any services
|
// any services
|
||||||
await App.registerDefaultServices();
|
App.registerDefaultServices();
|
||||||
|
|
||||||
final logger = App.service<Logger>();
|
final logger = App.service<Logger>();
|
||||||
logger.debug("[MAIN] Registered all default services");
|
logger.debug("[MAIN] Registered all default services");
|
||||||
|
|||||||
@@ -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/src/system/worker/worker_impl.dart';
|
||||||
import 'package:fluttery/worker.dart';
|
import 'package:fluttery/worker.dart';
|
||||||
import 'package:kiwi/kiwi.dart';
|
import 'package:kiwi/kiwi.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
|
||||||
|
|
||||||
/// A class to manage services.
|
/// A class to manage services.
|
||||||
class App {
|
class App {
|
||||||
@@ -32,11 +31,9 @@ class App {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Registers the default services required by the application.
|
/// Registers the default services required by the application.
|
||||||
static Future<void> registerDefaultServices() async {
|
static void registerDefaultServices() {
|
||||||
final prefs = await SharedPreferences.getInstance();
|
|
||||||
|
|
||||||
registerService<Logger>(() => LoggerImpl());
|
registerService<Logger>(() => LoggerImpl());
|
||||||
registerService<Preferences>(() => PreferencesImpl(instance: prefs));
|
registerService<Preferences>(() => PreferencesImpl());
|
||||||
registerService<SecureStorage>(() => SecureStorageImpl());
|
registerService<SecureStorage>(() => SecureStorageImpl());
|
||||||
registerService<Worker>(() => WorkerImpl());
|
registerService<Worker>(() => WorkerImpl());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,68 +2,85 @@ import 'package:fluttery/preferences.dart';
|
|||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
class PreferencesImpl implements Preferences {
|
class PreferencesImpl implements Preferences {
|
||||||
final SharedPreferences _prefs;
|
late final SharedPreferences _prefs;
|
||||||
|
bool _initialized = false;
|
||||||
|
|
||||||
/// Constructor
|
Future<void> _ensureInitialized() async {
|
||||||
PreferencesImpl({required SharedPreferences instance}) : _prefs = instance;
|
if (!_initialized) {
|
||||||
|
_prefs = await SharedPreferences.getInstance();
|
||||||
|
_initialized = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> setString(String key, String value) async {
|
Future<void> setString(String key, String value) async {
|
||||||
|
await _ensureInitialized();
|
||||||
await _prefs.setString(key, value);
|
await _prefs.setString(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<String?> getString(String key) async {
|
Future<String?> getString(String key) async {
|
||||||
|
await _ensureInitialized();
|
||||||
return _prefs.getString(key);
|
return _prefs.getString(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> setInt(String key, int value) async {
|
Future<void> setInt(String key, int value) async {
|
||||||
|
await _ensureInitialized();
|
||||||
await _prefs.setInt(key, value);
|
await _prefs.setInt(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<int?> getInt(String key) async {
|
Future<int?> getInt(String key) async {
|
||||||
|
await _ensureInitialized();
|
||||||
return _prefs.getInt(key);
|
return _prefs.getInt(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> setBool(String key, bool value) async {
|
Future<void> setBool(String key, bool value) async {
|
||||||
|
await _ensureInitialized();
|
||||||
await _prefs.setBool(key, value);
|
await _prefs.setBool(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<bool?> getBool(String key) async {
|
Future<bool?> getBool(String key) async {
|
||||||
|
await _ensureInitialized();
|
||||||
return _prefs.getBool(key);
|
return _prefs.getBool(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> setDouble(String key, double value) async {
|
Future<void> setDouble(String key, double value) async {
|
||||||
|
await _ensureInitialized();
|
||||||
await _prefs.setDouble(key, value);
|
await _prefs.setDouble(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<double?> getDouble(String key) async {
|
Future<double?> getDouble(String key) async {
|
||||||
|
await _ensureInitialized();
|
||||||
return _prefs.getDouble(key);
|
return _prefs.getDouble(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> setStringList(String key, List<String> value) async {
|
Future<void> setStringList(String key, List<String> value) async {
|
||||||
|
await _ensureInitialized();
|
||||||
await _prefs.setStringList(key, value);
|
await _prefs.setStringList(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<List<String>?> getStringList(String key) async {
|
Future<List<String>?> getStringList(String key) async {
|
||||||
|
await _ensureInitialized();
|
||||||
return _prefs.getStringList(key);
|
return _prefs.getStringList(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> remove(String key) async {
|
Future<void> remove(String key) async {
|
||||||
|
await _ensureInitialized();
|
||||||
await _prefs.remove(key);
|
await _prefs.remove(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> clear() async {
|
Future<void> clear() async {
|
||||||
|
await _ensureInitialized();
|
||||||
await _prefs.clear();
|
await _prefs.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -53,7 +53,7 @@ class WorkerImpl implements Worker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Now it's safe to touch plugins (e.g., SharedPreferences).
|
// Now it's safe to touch plugins (e.g., SharedPreferences).
|
||||||
await App.registerDefaultServices();
|
App.registerDefaultServices();
|
||||||
|
|
||||||
preTask?.call();
|
preTask?.call();
|
||||||
|
|
||||||
|
|||||||
@@ -11,8 +11,7 @@ void main() {
|
|||||||
|
|
||||||
// Create preferences instance that will use the real SharedPreferences
|
// Create preferences instance that will use the real SharedPreferences
|
||||||
// but with in-memory storage for testing
|
// but with in-memory storage for testing
|
||||||
final sharedInstance = await SharedPreferences.getInstance();
|
preferences = PreferencesImpl();
|
||||||
preferences = PreferencesImpl(instance: sharedInstance);
|
|
||||||
|
|
||||||
// Give time for initialization
|
// Give time for initialization
|
||||||
await Future.delayed(Duration.zero);
|
await Future.delayed(Duration.zero);
|
||||||
|
|||||||
Reference in New Issue
Block a user