Я хочу загрузить информацию профиля пользователя из firestore после того, как пользователь войдет в систему, и я хочу, чтобы эти данные были доступны всему приложению при входе в данные. Я планирую выполнить последующую часть, используя унаследованные виджеты во флаттере. Я могу правильно загрузить данные из firestore и получить все данные, но домашняя страница не ждет загрузки данных, прежде чем продолжить, поэтому я получаю ошибки. Он вызывает метод, затем игнорирует часть ожидания в методе и продолжает работу, поэтому я получаю ошибки, затем после ошибок я получаю сообщения с данными, которые были загружены.
Я попробовал пару вещей. У меня есть весь код управления пользователями (логин, регистрация, ...) в одном файле, и я написал метод getuserProfie()
в этом файле. Метод получает все данные, заполняет пользовательскую модель данными и возвращает эту модель. Смотрите код ниже.
getUserProfile() async {
UserModel theUser;
await FirebaseAuth.instance.currentUser().then((user) {
Firestore.instance
.collection('/users')
.where('uid', isEqualTo: user.uid)
.snapshots()
.listen((data) {
print('getting data');
theUser = new UserModel(user.uid, data.documents[0]['email'],);
print('got data');
print(theUser.email);
return theUser;
});
}).catchError((e) {
print("there was an error");
print(e);
});
}
Затем я вызываю этот метод на своей домашней странице следующим образом
@override
void initState() {
Usermode user = UserManagement().getUserProfile(); //Calling the method
super.initState();
}
Это вызывает метод очень хорошо и получает все данные, но программа не ждет, пока данные будут получены, чтобы продолжить. Я попытался переместить код, который получает данные, в метод initState()
и вызвать super.initState()
, когда я был уверен, что есть значение, но оно не работает. Я также пытался вызвать getUserProfile()
перед вызовом super.initstate()
, но это не сработало.
Я попытался добавить асинхронный заголовок initState()
, но флаттер не нравится. Я могу получить данные из firebase нормально, но проблема в том, чтобы заставить программу ждать, пока данные не будут получены. Похоже, использование await и async не работает. Любые другие предложения, чтобы убедиться, что данные загружаются, прежде чем продолжить? Я думал об использовании FutureBuilder
, но я не уверен, как это будет работать в этом случае.