18
class Peoples {
  late int id;
  late 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").

drmirk
  • 321
  • 1
  • 5
  • 12

3 Answers3

41

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);
}
4

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);
  }
}
José Luna
  • 169
  • 2
  • 4
  • kind of a weird example, How about I would like to pass in a list of valid people how would that look like. I struggle with getting that use model working. – Ride Sun Dec 08 '20 at 23:21
  • Well, for this context this model could be useless, but think in a singleton where you want to save info that you won't modify, it will just be read. It's like when you want to save an user after app started and you don't want to use shared preference or the cloud to hold and request about its info. I thought it would be useful. – José Luna Dec 12 '20 at 20:15
  • 1
    Assert only works in debugging mode. So, it would still reassign those values in production mode. – Əlişiram Dec 28 '20 at 11:48
1

The answer can not run on my machine, 29/3/2022

The computer says: “Non-nullable instance field 'id' must be initialized.”

I cannot comment, so write this answer:

Add keyword late before the member variables will help:

class Peoples {
  late int id;
  late String name;

  static final Peoples _inst = Peoples._internal();

  Peoples._internal();


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