Шаблон проектирования флаттера: смешивание метода построения и функции asyn c - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть следующая функция asyn c, которую мне нужно вызвать из моей страницы build (), чтобы получить UID текущего пользователя. Однако build () НЕ является асинхронной c функцией, и я не могу использовать функцию ожидания.

Так какова обычная практика здесь?

Future<String> getUID() async{
  bool isLoggedInFlag = isLoggedIn();
  if (isLoggedInFlag) {
    FirebaseUser user = await FirebaseAuth.instance.currentUser();
    String uid = user.uid;
    return uid
  }else{
    print("no uid found");
  }
}

1 Ответ

1 голос
/ 13 апреля 2020

Вы можете вызвать метод asyn c из метода initState (), но uid будет возвращать ноль до тех пор, пока метод asyn c не будет завершен:

class _TestState extends State<Test> {
  String uid;
  @override
  void initState() {
    super.initState();
    getUID();
  }

  void getUID() async {
    Future.delayed(Duration(seconds: 2)); //Simulate the Firebase call
    setState(() {
      uid = 'firebasevalue';
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text(uid ?? 'loading'),
    );
  }
}

Но это не единственное решение. Вы можете использовать FutureBuilder или StreamBuilder для работы со своими фьючерсами

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