Вам нужен синглтон с изменяемым состоянием. Это несколько разумно.
Если вы go с состоянием в экземпляре, вам нужны допустимые начальные значения. Что-то вроде:
class MyService {
static final MyService _singleton = MyService._internal();
String _level;
MyClass _clientCache;
String get level => level;
set level(String level) {
if (_level != level) {
_level = level;
_clientCache = level == "LOW" ? Class1() : Class2();
}
}
factory MyService({String level = "HIGH"}) => _singleton..level = level;
MyService._internal() : _level = "HIGH", _clientCache = Class1();
}
Тогда вы также можете просто сохранить это состояние в глобальной переменной. Это позволит вам выполнить ленивую инициализацию геттера _class
.
Что-то вроде:
class MyService {
static final MyService _singleton = const MyService._internal();
static String _level = "HIGH";
static MyClass _clientCache = _classFromLevel(_level);
String get level => _level;
void set level(String level) {
if (_level != level) {
_level = level;
_clientCache = _classFromLevel(level);
}
}
MyClass _client => _clientCache;
factory MyService({level = 'HIGH'}) => _instance..level = level;
const MyService._internal();
static MyClass _classFromLevel(String level) =>
level == "LOW" ? Class1() : Class2();
}
(Учтите, нужен ли вам действительно синглтон. Изменяемый синглтон object - это просто прославленная глобальная переменная со всеми присущими ей проблемами.)