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?

25voto

iBob101 Punkte 1310

Hier ist eine weitere Möglichkeit:

void main() {
  var s1 = Singleton.instance;
  s1.somedata = 123;
  var s2 = Singleton.instance;
  print(s2.somedata); // 123
  print(identical(s1, s2));  // true
  print(s1 == s2); // true
  //var s3 = new Singleton(); //produces a warning re missing default constructor and breaks on execution
}

class Singleton {
  static final Singleton _singleton = new Singleton._internal();
  Singleton._internal();
  static Singleton get instance => _singleton;
  var somedata;
}

17voto

Lucas Breitembach Punkte 1087

Singleton, das das Objekt nach der Instanziierung nicht mehr ändern kann

class User {
  final int age;
  final String name;

  User({
    this.name,
    this.age
    });

  static User _instance;

  static User getInstance({name, age}) {
     if(_instance == null) {
       _instance = User(name: name, age: age);
       return _instance;
     }
    return _instance;
  }
}

  print(User.getInstance(name: "baidu", age: 24).age); //24

  print(User.getInstance(name: "baidu 2").name); // is not changed //baidu

  print(User.getInstance()); // {name: "baidu": age 24}

15voto

Ticore Shih Punkte 377

Dart Singleton durch Konst-Konstruktor & Fabrik

class Singleton {
  factory Singleton() =>
    Singleton._internal_();
  Singleton._internal_();
}

void main() {
  print(new Singleton() == new Singleton());
  print(identical(new Singleton() , new Singleton()));
}

15voto

Iván Yoed Punkte 2558

In diesem Beispiel tue ich andere Dinge, die auch notwendig sind, wenn man ein Singleton verwenden will. Zum Beispiel:

  • einen Wert an den Konstruktor des Singletons übergeben
  • einen Wert innerhalb des Konstruktors selbst initialisieren
  • einen Wert für eine Singleton-Variable setzen
  • in der Lage sein, auf diese Werte zuzugreifen UND auf sie zuzugreifen .

Zum Beispiel so:

class MySingleton {

  static final MySingleton _singleton = MySingleton._internal();

  String _valueToBeSet;
  String _valueAlreadyInSingleton;
  String _passedValueInContructor;

  get getValueToBeSet => _valueToBeSet;

  get getValueAlreadyInSingleton => _valueAlreadyInSingleton;

  get getPassedValueInConstructor => _passedValueInContructor;

  void setValue(newValue) {
    _valueToBeSet = newValue;
  }

  factory MySingleton(String passedString) {
    _singleton._valueAlreadyInSingleton = "foo";
    _singleton._passedValueInContructor = passedString;

    return _singleton;
  }

  MySingleton._internal();
}

Verwendung von MySingleton:

void main() {

MySingleton mySingleton =  MySingleton("passedString");
mySingleton.setValue("setValue");
print(mySingleton.getPassedValueInConstructor);
print(mySingleton.getValueToBeSet);
print(mySingleton.getValueAlreadyInSingleton);

}

10voto

daveoncode Punkte 17391

Nachdem ich alle Alternativen gelesen hatte, kam ich auf diese Lösung, die mich an ein "klassisches Singleton" erinnert:

class AccountService {
  static final _instance = AccountService._internal();

  AccountService._internal();

  static AccountService getInstance() {
    return _instance;
  }
}

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