504 Stimmen

Wie baut man ein Singleton in Dart?

Das Singleton-Muster stellt sicher, dass immer nur eine Instanz einer Klasse erstellt wird. Wie baue ich das in Dart?

3voto

sprestel Punkte 66

Da ich nicht gerne die new Schlüsselwort oder andere konstruktorähnliche Aufrufe für Singletons zu verwenden, würde ich es vorziehen, einen statischen Getter namens inst zum Beispiel:

// the singleton class
class Dao {
    // singleton boilerplate
        Dao._internal() {}
        static final Dao _singleton = new Dao._internal();
        static get inst => _singleton;

    // business logic
        void greet() => print("Hello from singleton");
}

Anwendungsbeispiel:

Dao.inst.greet();       // call a method

// Dao x = new Dao();   // compiler error: Method not found: 'Dao'

// verify that there only exists one and only one instance
assert(identical(Dao.inst, Dao.inst));

3voto

Vilsad P P Punkte 1493

Das sollte funktionieren.

class GlobalStore {
    static GlobalStore _instance;
    static GlobalStore get instance {
       if(_instance == null)
           _instance = new GlobalStore()._();
       return _instance;
    }

    _(){

    }
    factory GlobalStore()=> instance;

}

1voto

BIS Tech Punkte 12344

Singleton erstellen

class PermissionSettingService {
  static PermissionSettingService _singleton = PermissionSettingService._internal();

  factory PermissionSettingService() {
    return _singleton;
  }

  PermissionSettingService._internal();
}

Singleton zurücksetzen

// add this function inside the function
  void reset() {
   _singleton = PermissionSettingService._internal();
  }

1voto

Christian Findlay Punkte 5653

Es ist nicht schwierig, ein Singleton in Dart zu erstellen. Sie können jede Variable auf oberster Ebene (global) deklarieren, die standardmäßig ein Singleton ist. Sie können eine Variable auch als statisches Mitglied einer Klasse deklarieren. Dies ist ein Singleton A .

class A {}

final a = A();

Allerdings können Sie die Instanz zu Testzwecken nicht ersetzen. Das andere Problem ist, dass Sie mit zunehmender Komplexität der Anwendung möglicherweise globale oder statische Variablen in transiente Abhängigkeiten innerhalb Ihrer Klassen umwandeln möchten. Wenn Sie Dependency Injection verwenden, können Sie eine Abhängigkeit innerhalb Ihrer Komposition jederzeit ändern. Dies ist ein Beispiel für die Verwendung von ioc_container um eine Einzelinstanz von A im Root einer App. Sie können dies jederzeit in eine transiente Abhängigkeit ändern, indem Sie add anstelle von addSingletonService

import 'package:ioc_container/ioc_container.dart';

class A {}

void main(List<String> arguments) {
  final builder = IocContainerBuilder()..addSingletonService(A());
  final container = builder.toContainer();
  final a1 = container<A>();
  final a2 = container<A>();
  print(identical(a1, a2));
}

Die obigen Drucke true weil die Anwendung immer nur eine Instanz von A .

1voto

Ajanyan Pradeep Punkte 1023

Dies ist auch eine Möglichkeit, eine Singleton-Klasse zu erstellen

class Singleton{
  Singleton._();
  static final Singleton db = Singleton._();
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X