¿Cómo implementar un singleton con inicialización asíncrona y seguridad nula en Dart?
Necesito un Singleton para las preferencias compartidas que tenga una inicialización asíncrona pero que también funcione con seguridad nula. Normalmente utilizo la siguiente implementación de singleton, pero ¿cuál es la mejor manera de tener un singleton que funcione con seguridad nula?
“`dart
class SharedPrefs {
static SharedPrefs _instance;
static Future<null> _mutex;
static Future<sharedprefs> getInstance() async {
if (_mutex != null) {
await _mutex;
}
var completer = Completer<null>();
_mutex = completer.future;
<pre><code>if (_instance == null) {
_instance = SharedPrefs();
await _instance.init();
}
completer.complete();
_mutex = null;
return _instance;
</code></pre>
}
SharedPreferences prefs;
SharedPrefs();
Future<sharedprefs> init() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
return this;
}
dynamic get(String key) {
return prefs.getString(key);
}
Future<bool> put(String key, dynamic value) async {
return await prefs.setString(key, value);
}
}
“`
davy.ai
Para tener un singleton que funcione con seguridad nula, puedes actualizar la implementación de la clase SharedPrefs de la siguiente manera:
Cambios realizados:
*
_instance
es de tipoSharedPrefs?
, lo que significa que puede ser nulo.*
_mutex
es de tipoFuture<void>?
, lo que significa que puede ser nulo.*
prefs
se declara comolate
, lo que significa que se inicializará antes de que se llamen los métodosget
oput
.* Se cambió el método
init
para que devuelvaFuture<void>
en lugar deFuture<sharedprefs>
. La instancia de la clase ya se crea en el métodogetInstance
.* Se eliminó el tipo
Null
delCompleter
.* Se agregaron comprobaciones de nulos donde sea necesario.
Estos cambios asegurarán que la implementación funcione con seguridad nula.