асинхронный флаттер для синхронизации программирования - PullRequest
1 голос
/ 16 октября 2019

Это, вероятно, только я, но асинхронное программирование во флаттере кажется абсолютным кошмаром. Что-то действительно простое в javascript / typcript просто кажется неоправданно сложным. например, я пытаюсь создать простую функцию, которая проверяет, прошел ли пользователь аутентификацию:

Future<bool> isLoggedIn() async {
  var user = await FirebaseAuth.instance.currentUser();
  return user == null ? false : true;
}

, а затем использует эту функцию в сценарии, подобном следующему:

Widget _buildChild() async {
    var auth = await user.isLoggedIn();
    if (auth) {
      return new Navigation();
    } else {
      return new LoginUI();
    }
}

Нотогда вторая функция также должна возвращать будущее?

Функции, отмеченные как «асинхронные», должны иметь тип возвращаемого значения, присваиваемый «Future».

, используя вместо этого then ()ожидание тоже не работает. Я сталкивался с этой проблемой несколько раз, когда использовал асинхронное программирование в синхронном контексте. Может быть, это просто то, что он выглядит и чувствует себя очень похожим на Обещания, что я полностью скучаю по его функциональности из документов.

1 Ответ

1 голос
/ 16 октября 2019

Вы можете изменить свой код следующим образом:

Widget _buildChild() {
  return FutureBuilder(builder: (context, AsyncSnapshot<bool> snapshot) {
    if (snapshot.hasData)
      return snapshot.data ? Navigation() : LoginUI();
    else
      return Container();
  },
  future: user.isLoggedIn(),);
}

Он возвращает виджет синхронно. Если данных еще нет - возвращается пустое значение Container, а когда isLoggedIn() возвращает значение - этот метод вернет необходимый виджет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...