Flutter - получить значение из геттера после функции future - PullRequest
0 голосов
/ 01 августа 2020

У меня есть такой код:

  Future<FirebaseUser> _getUser() async {
    return await _fireAuth.currentUser();
  }

  bool get isSignedIn {
    _getUser().then((value) {
      return value != null;
    }).catchError((err) {
      print("Error While knowing isSignedIn --> $err");
    });
  }

В принципе, как мне заставить код ждать, пока он получает данные из будущей функции, т.е. _getUser (), а затем вернуть результат через геттер, т.е. isSignedIn. Используя этот код, результатом геттера isSignedIn будет null

Я все еще новичок во Flutter. Мы будем очень благодарны за вашу помощь.

Ответы [ 4 ]

0 голосов
/ 01 августа 2020

На самом деле я думаю, что вам нужен Stream. Когда пользователь входит или выходит из системы, ваш поток обновляется.

Stream<FirebaseUser> get isSignedIn => _fireauth.onAuthChanged; 
0 голосов
/ 01 августа 2020
Future<bool> get isSignedIn async {
  try { 
    var user = await _getUser(); // wait for the function to finish
    return Future.value(user != null);
  catch (error) {
    print("Error While knowing isSignedIn --> $err");
  }
}

Можете попробовать.

0 голосов
/ 01 августа 2020

Если я правильно понимаю, я считаю, что вы пытаетесь получить значение, возвращаемое функцией, в вашем .then(). Вы не можете. По крайней мере, не так, как вы пытаетесь это сделать.

Насколько я понимаю, возвращаемое значение .then() можно использовать в качестве параметра для следующего .then(), если вы ' переплетать их. Например, getuser().then(({return value of getUser})) => user).then(({this is the user}) => user.uid).then(({this is the user.uid})) ; //...etc

Если вы хотите захватить это значение, вычисленное внутри .then(), у вас должна быть переменная снаружи, значение которой будет содержать результат.

Например

var myuser;
getUser().then((user) => myuser = user);

Не совсем ваш код, но вы его понимаете.

В противном случае я думаю, что лучше всего по возможности избегать использования then. Использование await позволяет вам писать код, который выглядит синхронным и более легким для чтения.

Например, var user = await getUser()

Здесь вам не нужно .then() вообще

0 голосов
/ 01 августа 2020

U придется возвращать Future<bool>, поскольку вы вызываете функцию async _getUser()

Future<bool> get isSignedIn async {
  try { 
    var user = await _getUser(); // wait for the function to finish
    return user != null;
  catch (error) {
    print("Error While knowing isSignedIn --> $err");
  }
}
...