【问题标题】:Flutter: Firestore Get User uid inside StreamBuilderFlutter:Firestore 在 StreamBuilder 中获取用户 uid
【发布时间】:2020-10-17 13:10:23
【问题描述】:

我有一个应用程序,我想在集合中显示文档。集合引用是用户的 uid。

有没有办法获取当前用户 uid 并将此 uid 放入 StreamBuilder 中的流中。

我尝试过这样但它不起作用并返回null:

class _MyAdsState extends State<MyAds> {

 final FirebaseAuth _auth = FirebaseAuth.instance;

Future getCurrentUser() async {
 final FirebaseUser user = await _auth.currentUser();
 final uid = user.uid;
 print(uid);
 return uid.toString();
}

@override
  Widget build(BuildContext context) {
   return Scaffold(
   
body: Column(
 Expanded(
          child: StreamBuilder<QuerySnapshot>(
            stream: Firestore.instance.collection("${getCurrentUser()}").snapshots(),
            builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> querySnapShot){
              if(querySnapShot.hasError){
                return Text('Some Error');
              }
              if(querySnapShot.connectionState == ConnectionState.waiting){
                return CircularProgressIndicator();
              }else{
                final list = querySnapShot.data.documents;

                return ListView.builder(
                    itemBuilder: (context, index){
                      return ListTile(
                        title: Text(list[index]["subject"]),
                        subtitle: Text(list[index]["category"]),
                      );
                    },
                  itemCount: list.length,
                );
              }
            },
          )

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    获取 UID 是异步操作,因此需要 FutureBuilder

    如果您想使用 UID 来构建流,则需要有一个 FutureBuilder 用于 UID,然后在其中一个 StreamBuilder 用于来自数据库的流。

    body: FutureBuilder(
      future: FirebaseAuth.instance.currentUser(),
      builder: (context, AsyncSnapshot<FirebaseUser> snapshot) {
        if (snapshot.hasData) {
          return StreamBuilder<QuerySnapshot>(
            stream: Firestore.instance.collection(snapshot.data.uid).snapshots(),
            builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> querySnapShot){
              ...
            },
          )
        }
        else {
          return Text('Loading user data...');
        }
    

    【讨论】:

      【解决方案2】:

      谢谢你们!

      我找这个已经太久了。我有一个“问题”,即我只记录发送消息的 senderUID,但当然希望名称显示在“sentFrom”字段中。所以我不得不向 Firestore 查询 UID 并取出电子邮件。我的解决方案:

      FutureBuilder<QuerySnapshot>(
                future: _firestore.collection("users").get(),
                builder: (context, futureSnapshot) {
                  if (!futureSnapshot.hasData) {
                    return Center(
                      child: CircularProgressIndicator(),
                    );
                  }
      
                  Map<String, String> users = {};
                  final userData = futureSnapshot.data.docs;
                  for (var user in userData) {
                    users[user.id] = user.data()["email"];
                  }
      
                  return StreamBuilder<QuerySnapshot>(
                    stream: _firestore.collection("messages").snapshots(),
                    builder: (context, snapshot) {
                      if (!snapshot.hasData) {
                        return Center(
                          child: CircularProgressIndicator(),
                        );
                      }
                      // ignore: missing_return
                      final messages = snapshot.data.docs;
                      List<Widget> messageWidgets = [];
                      for (var message in messages) {
                        final messageText = message.data()["text"];
                        final messageEmail = users[message.data()["senderUID"]];
                        messageWidgets
                            .add(Text("$messageText from $messageEmail"));
                      }
                      return Column(children: messageWidgets);
                    },
                  );
                },
              ),
      

      我刚刚从数据中创建了一个地图,并在流构建器中使用了它。有没有更好的解决方案?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-05
        • 2020-11-30
        • 1970-01-01
        • 2020-01-01
        • 2018-09-02
        • 2017-08-19
        • 2019-05-28
        相关资源
        最近更新 更多