Flutter - 如何从 Firestore 返回当前用户

Posted

技术标签:

【中文标题】Flutter - 如何从 Firestore 返回当前用户【英文标题】:Flutter - How to return current user from Firestore 【发布时间】:2019-06-12 04:02:13 【问题描述】:

尝试从现有 Firestore 用户文档中检索经过身份验证的用户详细信息,我收到以下错误:

在 null 上调用了 getter '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”对象的解决方案很少,但无法弄清楚如何以正确的方式实现它,请帮忙?

【问题讨论】:

在此处准确展示您如何设置user 非常重要。它来自哪里? @DougStevenson 它是 FirebaseUser 的一个实例:请查看“最终 FirebaseUser 用户;”在代码顶部。 是的,您已经声明了一个 FirebaseUser 成员变量,但您从未在您显示的代码中分配它。在您分配之前它将为空。 【参考方案1】:

如果您使用的是Future,我猜当您调用SideDrawer 时,用户为空,因此您必须先添加验证,然后才能使用“用户”对象。

 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(),)
            );

        

从 HomePage 传递 SideDrawer 小部件上的用户对象

  SideDrawer(user: user),

同时修正这一行:

 return snapshot.data['name'];

应该是:

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

【讨论】:

以上是关于Flutter - 如何从 Firestore 返回当前用户的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:Google Maps 如何从 Firestore 设置图标

如何从 Flutter 将文档创建时间戳添加到 Firestore [重复]

如何使用 Flutter 从 Firestore 中的 ListView 获得无限滚动

flutter-firestore:如何从列表视图中删除 n 天前的项目

如何在flutter中将数据从firestore传递给Typeahead

如何在 Firestore -Flutter 中将所有文档从一个集合复制到另一个集合?