Как заставить мой флаттер-код ждать завершения функции, прежде чем продолжить? - PullRequest
0 голосов
/ 31 марта 2020

У меня проблемы с поиском способа заставить мой код ждать завершения функции, прежде чем продолжить. Причина этого в том, что мне нужна функция, чтобы сначала извлечь текущего пользователя из firebase, а затем перейти к использованию этого значения и решить, какой экран показывать дальше.

Способ, которым я собираюсь работать для кода заключается в проверке того, существует ли уже пользователь, выполнивший вход. Если есть, тогда выполните еще одну проверку, чтобы увидеть, существует ли информация для этого пользователя - если это так, то возвращает домашний экран и не возвращает ли экран информации о пользователе. Если в данный момент не зарегистрировано ни одного пользователя, должен появиться экран «Аутентификация».

class SignedInState extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

   final user = _getCurrentUser();

    if (user == null) {
      return Authenticate();
    } else {
     final snapShot = checkifDocumentExists(user);
      if (snapShot == null) {
      return UserInformation();
      } else {
      return Home();
    }
    }
  }
}
Future _getCurrentUser() async {
   final user = await FirebaseAuth.instance.currentUser();
   print(user);
   print(user.toString());
   return user;
    }

Это моя первая публикация здесь, так что просто дайте мне знать, если вам нужна дополнительная информация и т.д. c.

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

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

Для этого необходимо вызвать функцию в методе initState:

class SignedInState extends StatefulWidget {
  @override
  _SignedInStateState createState() => _SignedInStateState();
}

class _SignedInStateState extends State<SignedInState> {
  var user; // made user acessible to all class
  bool hasData = false;
  @override
  void initState() {
    super.initState();
    // call method when build is done
    SchedulerBinding.instance.addPostFrameCallback((_) => _getCurrentUser());
  }

  Future _getCurrentUser() async {
    user = await FirebaseAuth.instance.currentUser();
    setState(() {
      hasData = true;
    });
  }

  @override
  Widget build(BuildContext context) {
    if (!hasData) {
      return Container();
    } else if (user == null && hasData) {
      return Authenticate();
    } else {
      final snapShot = checkifDocumentExists(user);
      if (snapShot == null) {
        return UserInformation();
      } else {
        return Home();
      }
    }
  }
}
0 голосов
/ 31 марта 2020

У меня была такая же проблема только вчера. Я нашел решение использовать final user = Provider.of<User>(context); вместо этого. Так что если вы создали объект User после аутентификации, вы можете использовать его тоже.

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