首页 > 解决方案 > Flutter with firebase 试图在与我的登录屏幕不同的屏幕或小部件上访问当前用户

问题描述

所以我有一个用于登录屏幕的 dart 文件,然后是一个不同的主文件。我正在尝试访问主文件中的用户 ID 以获取用户唯一的 Cloud Firestore 文档。但是,每当我调用 getUser() 时,它都会说 Future 不是“String”类型的子类型。这是否意味着由于某种原因未打开 Future 以返回 uid 字符串?

getUser() async {
      FirebaseUser user = await FirebaseAuth.instance.currentUser();
      return user.uid;
  }

这是我在与身份验证不同的 dart 文件中调用 get user 的地方,但在与我的 getUser() 函数相同的文件中。

return StreamBuilder<DocumentSnapshot>(
     stream: Firestore.instance.collection('watchlists').document(getUser()).snapshots(),
     builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot){
       if (snapshot.hasError) {
         return new Center(
           child: Text('Error: ${snapshot.error}'),
         );
       }
       if (!snapshot.hasData) {
         return new Center(
           child: CircularProgressIndicator(),
         );
       }
       else {
         var documents = snapshot.data.data;
         var vals = documents.values;
         List<WatchListItem> watchListItems = [];
         for (int x = 0; x < vals.length; x++) {
           watchListItems.add(
             WatchListItem(
               symbol: vals.elementAt(x).toString(),
               price: 190.79,
             ),
           );
         }

         return new Center(
           child: ListView(
             children: watchListItems,
           ),
         );
       }
     },
   );

当我尝试 getUser().toString() 时,我得到的错误是在 null 上调用了 getter 'values'(我正在尝试获取数据库值)。当前用户只能在认证时访问吗?或者只要用户登录,就可以随时在应用程序的任何地方访问它?我看到的一种解决方法是在登录时获取 uid,然后将其作为参数传递给我去的每个新 Widget。我在这方面遇到了非常艰难的时期,因为不知何故,谷歌几乎没有任何关于将他们自己的 Flutter 与他们的 Firebase 结合使用的文档。

标签: firebaseflutterdartgoogle-cloud-firestorefirebase-authentication

解决方案


getUser()返回 a Future<String>whiledocument()接受 aString作为参数:

/// so that the resulting list will be chronologically-sorted.
  DocumentReference document([String path]) =>
      DocumentReference._(_delegate.document(path), firestore);

因此最好打电话的地方getUser()是里面initState。在里面initState你可以做:

String userId = await getUser();

然后使用userIdindocument()


推荐阅读