Flutter - Как вернуть текущего пользователя из Firestore - PullRequest
0 голосов
/ 18 января 2019

При попытке получить данные аутентифицированного пользователя из существующего пользовательского документа Firestore, я получаю следующую ошибку:

Получатель 'uid' был вызван нулем

мой код выглядит следующим образом:

    class SideDrawer extends StatelessWidget {
      const SideDrawer({Key key, this.user}) : super(key: key);
      final FirebaseUser user;

      @override
      Widget build(BuildContext context) {
        return ......
              ......
              userPanel(context),
              ......
      }

      Widget userPanel(BuildContext context) {
        return new Padding(
          padding: const EdgeInsets.only(top: 10.0),
          child: new DrawerHeader(
            child: StreamBuilder<DocumentSnapshot>(
              stream: Firestore.instance
                  .collection('users')
                  .document(user.uid)
                  .snapshots(),
              builder:
                  (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
                if (snapshot.hasError) {
                  return Text('Error: ${snapshot.error}');
                } else if (snapshot.hasData) {
                  return userName(snapshot.data);
                }
                return LinearProgressIndicator();
              },
            ),
          ),
        );
      }
    }

Text userName(DocumentSnapshot snapshot) {
  if (snapshot.data == null) {
    return Text('no data set in the user document in firestore');
  } else {
    return snapshot.data['name'];
  }
}

отправка пользователя со страницы входа в систему:

  void signIn() async {
    if(_formKey.currentState.validate()){
      _formKey.currentState.save();
      try{
        FirebaseUser user = await FirebaseAuth.instance.signInWithEmailAndPassword(email: _email, password: _password);
        Navigator.push(context, MaterialPageRoute(builder: (context) => HomePage(user: user)));
      }catch(e){
        print(e.message);
      }
    }
  }
}

и вот моя домашняя страница:

class HomePage extends StatelessWidget {
  const HomePage({Key key, this.user}) : super(key: key);
  final FirebaseUser user;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      drawer: SideDrawer(),
    );
  }
}

Предполагая, что это проблема асинхронного программирования, я провел поиск по ней и нашел несколько решений, использующих объект "Future", но не мог понять, как правильно его реализовать, какую-либо помощь, пожалуйста?

1 Ответ

0 голосов
/ 18 января 2019

Если вы используете Future Я предполагаю, что при вызове SideDrawer пользователь имеет значение null, поэтому вам нужно добавить проверку, прежде чем вы сможете использовать объект 'user'.

 Widget userPanel(BuildContext context) {
            return new Padding(
              padding: const EdgeInsets.only(top: 10.0),
              child:  user != null ? DrawerHeader(
                child: StreamBuilder<DocumentSnapshot>(
                  stream: Firestore.instance
                      .collection('users')
                      .document(user.uid)
                      .snapshots(),
                  builder:
                      (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
                    if (snapshot.hasError) {
                      return Text('Error: ${snapshot.error}');
                    } else if (snapshot.hasData) {
                      return userName(snapshot.data);
                    }
                    return LinearProgressIndicator();
                  },
                ),
              ) : Center(child: CircularProgressIndicator(),)
            );

        }

Передайте пользовательский объект на виджет SideDrawer из HomePage

  SideDrawer(user: user),

Также исправьте эту строку:

 return snapshot.data['name'];

Должно быть:

  return Text(snapshot.data['name']);
...