es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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);
}
}
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para tener un singleton que funcione con seguridad nula, puedes actualizar la implementación de la clase SharedPrefs de la siguiente manera:

    import 'package:shared_preferences/shared_preferences.dart';
    
    class SharedPrefs {
      static SharedPrefs? _instance;
      static Future<void>? _mutex;
    
      static Future<sharedprefs> getInstance() async {
        if (_mutex != null) {
          await _mutex;
        }
        var completer = Completer<void>();
        _mutex = completer.future;
    
        if (_instance == null) {
          _instance = SharedPrefs();
          await _instance!.init();
        }
    
        completer.complete();
        _mutex = null;
    
        return _instance!;
      }
    
      late SharedPreferences prefs;
    
      SharedPrefs();
    
      Future<void> init() async {
        prefs = await SharedPreferences.getInstance();
      }
    
      dynamic get(String key) {
        return prefs.getString(key);
      }
    
      Future<bool> put(String key, dynamic value) async {
        return await prefs.setString(key, value);
      }
    }
    

    Cambios realizados:
    * _instance es de tipo SharedPrefs?, lo que significa que puede ser nulo.
    * _mutex es de tipo Future<void>?, lo que significa que puede ser nulo.
    * prefs se declara como late, lo que significa que se inicializará antes de que se llamen los métodos get o put.
    * Se cambió el método init para que devuelva Future<void> en lugar de Future<sharedprefs>. La instancia de la clase ya se crea en el método getInstance.
    * Se eliminó el tipo Null del Completer.
    * Se agregaron comprobaciones de nulos donde sea necesario.

    Estos cambios asegurarán que la implementación funcione con seguridad nula.

Comments are closed.