Как попасть внутрь данных в будущем >? - PullRequest
0 голосов
/ 16 июня 2020
Future<Map> returnUserMap() async {
    final FirebaseUser currentUser = await _auth.currentUser();
    Map userMap = {
      "UserName": currentUser.displayName,
      "UserEmail": currentUser.email,
      "UserUrl": currentUser.photoUrl
    };
    print("1");
    print(userMap);
    return userMap;
  }

тип возвращаемого значения - Instance of 'Future>'. Я хочу получить UserName, как мне это сделать?

1 Ответ

0 голосов
/ 16 июня 2020

Ваша функция 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

...