номер пользователя firebase показывает ноль - PullRequest
0 голосов
/ 06 января 2020

Я хочу отобразить номер телефона пользователя на экране, но на экране отображается ноль

String _userId;

  @override
  Widget build(BuildContext context) {
    FirebaseAuth.instance.currentUser().then((user) {
      _userId = user.phoneNumber;
    });
    print(_userId);
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(),
        body: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            children: <Widget>[
              Container(
                child:  Text("$_userId")
                    ?? CircularProgressIndicator(),

Ответы [ 3 ]

2 голосов
/ 06 января 2020

Вам необходимо использовать FutureBuilder, виджет FutureBuilder поставляется с Flutter и упрощает работу с асинхронными c источниками данных. Поэтому вам нужно сделать следующее:

 @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(),
        body: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            children: <Widget>[
              Container(
                child : FutureBuilder(
                  future: FirebaseAuth.instance.currentUser(),
                  builder: (context, snapshot) {
                          if (snapshot.hasData) {
                               print(snapshot);
                    return Text(snapshot.data.uid);
                    }
                    // By default, show a loading spinner.
                    return CircularProgressIndicator();
                  }
                )

Свойство future будет содержать асинхронные вычисления, к которым в данный момент подключен этот компоновщик, возможно, null. Также вы должны использовать Stateful Widget.

2 голосов
/ 06 января 2020

Вам нужно переместить запрос Firebase за пределы метода сборки. Метод сборки постоянно запускается, так как ваш виджет перестраивается. В идеале вы должны реализовать это следующим образом:

// _userId needs to be initiated with a blank value
String _userId = '';

@override
void initState() {
  loadCurrentUser();
  super.initState();
}

void loadCurrentUser(){
  FirebaseAuth.instance.currentUser().then((user) {
    setState(() {
      _userId = user.phoneNumber;
    });
  });
}

Таким образом, как только информация будет загружена, ваше представление будет обновлено.

1 голос
/ 06 января 2020

Вы должны показать больше своего кода, но похоже, что вы используете StatelessWidget, что означает, что после того, как это Future вернется, значение _userId в методе сборки не будет обновляться само по себе. Самый простой способ - использовать StatefulWidget и вызвать setState в вашем Future, чтобы обновить значение.

Также ваша строка Text("$_userId")?? CircularProgressIndicator() не будет работать правильно из-за той же проблемы, но вам нужно показать один или другой виджет в зависимости от значения _userId.

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