In Dart, is it possible to pass an argument in a singleton?

9,417

Solution 1

Sure! You need to pass the arguments to the factory method then you need to update the properties USING the referenced instance.

For example, you had

class Peoples {
  int id;
  String name;

  static final Peoples _inst = Peoples._internal();

  Peoples._internal();

  factory Peoples() {
    return _inst;
  }
}

If you apply my solution then you have

class Peoples {
  int id;
  String name;

  static final Peoples _inst = Peoples._internal();

  Peoples._internal();

  factory Peoples({int id, String name}) {
    _inst.id = id
    _inst.name = name
    return _inst;
  }
}

with this your question should be answered for more info about factory and params visit

https://dart.dev/guides/language/language-tour

Working Example

class Peoples {
  int id;
  String name;

  static final Peoples _inst = Peoples._internal();

  Peoples._internal();


  factory Peoples(int id, String name) {
    _inst.id = id;
    _inst.name = name;
    return _inst;
  }
}

void main() {
  print("Instance of = " + Peoples(0, "Dylan").name);
  print("Instance of = " + Peoples(1, "Joe").name);
  print("Instance of = " + Peoples(2, "Maria").name);
}

Solution 2

I'd like to answer showing a way to create a singleton by passing arguments to it and how to "lock" its values after creating it for the first time.

class People {
  static final People _inst = People._internal();
  People._internal();

  factory People(int id, String name) {
    assert(!_inst._lock, "it's a singleton that can't re-defined");
    _inst.id = id;
    _inst.name = name;
    _inst._lock = true;
    return _inst;
  }
  
  int id;
  String name;
  bool _lock = false;
}

void main() {
  var people = People(0, 'Dylan');
  try{
    print('Instance of = ' + People(0, 'Joe').name);
    print('Instance of = ' + People(1, 'Maria').name);
    print('Instance of = ' + People(2, 'Ete sech').name);
  } finally {
    print('Instance of = ' + people.name);
  }
}
Share:
9,417
drmirk
Author by

drmirk

no regret...

Updated on December 11, 2022

Comments

  • drmirk
    drmirk over 1 year
    class Peoples {
      int id;
      String name;
    
      static final Peoples _inst = Peoples._internal();
    
      Peoples._internal();
    
      factory Peoples() {
        return _inst;
      }
    }
    

    I have this singleton class. Which ensures that, only one instance of a class is ever created. So, even if someone tries to instantiate it, they will use the same instance. And i can create and set values, like:

      Peoples ps1 = Peoples();
      Peoples ps2 = Peoples();
    
      ps1.id = 1;
      ps1.name = "First";
    
      ps2.id = 2;
      ps2.name = "Second";
    

    Is it possible to instantiate and set values like:

      Peoples ps1 = Peoples(1, "First");
      Peoples ps2 = Peoples(2, "Second");
    

    So, now both "ps1" and "ps2" will have (2, "Second").