#flutter #future #flutter-futurebuilder
Вопрос:
Я пытаюсь получить снимок Firestore, и мой код, похоже, не работает. Я убедился fireUser.uid
, что все работает, и он напечатал правильный идентификатор, но, как ни странно, мой .then()
код вообще не работает, я его вставил print('then')
и не появляется на моей консоли
именно здесь происходит ошибка:
FutureBuilder(
future: Future.wait([
DatabaseService.getUserDataFromFirestore(FirebaseAuth.instance.currentUser!),
GeoService.getPosition(),
]),
builder: (context, snap) {
if (snap.connectionState == ConnectionState.done) {
return Frame();
}
else return Container(
color: Colors.black,
child: Center(
child: spinKit,
),
);
}
);
Будущее с ошибкой:
static Future<Userdata> getUserDataFromFirestore (User fireUser) async {
await usersRef.doc(fireUser.uid).get().then((val) {
print('then');
userdata = Userdata.fromDoc(val);
});
return userdata;
}
сообщение об ошибке:
LateInitializationError: Field 'userdata' has not been initialized.
Комментарии:
1. Вы уверены, что ошибка исходит от
return userdata
линии?2. нет, ошибка возникает позже в моем коде, когда я пытаюсь использовать «данные пользователя», извините, я не очень ясно выразился по этому поводу
3.
late
следует использовать только в том случае, если вы можете логически гарантировать, что инициализируетеuserdata
его до его использования. Если вы не можете предоставить эту гарантию, сделайте ее недействительной и проверьтеnull
значение везде, где вы ее используете.4. он всегда должен быть инициализирован, этот код работал для меня и раньше, но внезапно, когда я открыл flutter сегодня, он перестал работать. Я думаю, что проблема в том, откуда «.then ()», потому что этот код вообще не запускается
5.В использовании нет ничего плохого
.then
(кроме того, что это плохой стиль для смешивания.then
await
). Однако для инициализации вы полагаетесь на асинхронную операциюuserdata
, что является плохой идеей дляlate
переменных , поскольку это предоставляет больше возможностей для доступа к ней до ее инициализации. Вы не видите срабатывания обратного вызова, потому что вы получаете доступuserdata
и запускаете егоLateInitializationError
до выполнения обратного вызова.
Ответ №1:
Тогда у меня была другая проблема, как я думал. Firestore, должно быть, был обновлен, потому что правила моей базы данных Firestore заблокировали меня, поэтому я обновил правила, и теперь мой код работает нормально. Большое спасибо за помощь
Комментарии:
1. К вашему сведению, это,
LateInitializationError
скорее всего, указывает на отдельную проблему, которая была выявленаFuture
из-за того, что вы не завершили. То есть, если вы не исправите это, это может повториться, если этоFuture
когда-нибудь займет больше времени, чем обычно.