Ваша функция returnUserMap()
возвращает Future<Map>
. Я подозреваю, что описываемая вами ошибка отсутствует в скопированном вами фрагменте кода.
Всякий раз, когда выполнение задачи может занять некоторое время, вы получите future. Вы можете ждать фьючерсов в функции asyn c с помощью await .
Поэтому рекомендуется использовать так называемый FutureBuilder в вашей функции build ():
FutureBuilder<FirebaseUser>(
future: _auth.currentUser(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
final FirebaseUser user = snapshot.data;
if (user.displayName == null || user.displayName.isEmpty())
return text(currentUser.email); // display email if name isn't set
return text(currentUser.displayName);
}
if (snapshot.hasError) {
return text(snapshot.error);
}
return text('loading...');
},
),
Если вы хотите иметь displayName вне функции build (), следующий код должен выполнять работу, когда вы находитесь внутри функции asyn c:
final FirebaseUser user = await _auth.currentUser();
final String displayName = user.displayName;
print('the displayName of the current user is: $displayName');
И этот код, когда у вас нормальная работа:
_auth.currentUser().then((FirebaseUser user) {
String displayName = user.displayName;
print('displayName: $displayName');
}).catchError((error) {
print('error: ' + error.toString());
});
Думаю, для дальнейшего понимания стоит посмотреть следующее видео: Async / Await - Flutter in Focus