Вы можете обеспечить одноэлементный экземпляр класса, используя общедоступный конструктор фабрики с частным обычным конструктором:
class Helper {
static Helper _instance;
factory Helper() => _instance ??= new Helper._();
Helper._();
...
}
Если вы позвоните new Helper()
, вы всегда получите один и тот же экземпляр.
Вам необходимо импортировать файл, содержащий class Helper {}
везде, где вы хотите его использовать.
??=
означает, что new Helper._()
выполняется только тогда, когда _instance
равно null
, и если оно выполнено, результат будет присвоен _instance
до того, как он будет возвращен вызывающей стороне.
обновление
getUserDetailsFromSharedPreference
- это async
, и поэтому его нельзя использовать так, как вы его используете, по крайней мере, это не приведет к ожидаемому результату. getUserDetailsFromSharedPreference
возвращает Future
, который предоставляет результат при завершении Future
.
class UserProfileState extends State<UserProfile> {
Helper helper = new Helper();
Future<Map> _userData; // this with ??= of the next line is to prevent `getUserDetailsFromSharedPreference` to be called more than once
Future<Map> get userData => _userData ??= helper.getUserDetailsFromSharedPreference();
}
Если вам нужен доступ к userData
, вам нужно пометить метод, которым вы пользуетесь, async
и использовать await
, чтобы получить результат.
foo() async {
var ud = await userData;
print(ud);
}