firebase flutter中没有为类型“Object”定义uid

mitkmikd  于 2023-01-21  发布在  Flutter
关注(0)|答案(4)|浏览(118)

我尝试到检查如果一个用户id是相同的作为这当前用户的id通过使用data.uid但是我keep得到这错误:
没有为类型“Object”定义getter“uid”。
这是密码

Widget build(BuildContext context) {

    return FutureBuilder(
        future: Future.value(FirebaseAuth.instance.currentUser),
        builder: (context, futureSnapshot){
          if(futureSnapshot.connectionState == ConnectionState.waiting){
            return Center(child: CircularProgressIndicator(),);
      }
           return StreamBuilder <QuerySnapshot>(
      stream: firestore.collection('chats').orderBy('timeStamp', descending: true).snapshots(),
      builder:(ctx, chatSnapshot){
      if(chatSnapshot.connectionState == ConnectionState.waiting){
        return Center(child: CircularProgressIndicator(),);
      }
      final chatdocs = chatSnapshot.data!.docs;
      
      return ListView.builder(
        reverse: true,
        itemCount: chatdocs.length ,
        itemBuilder: (ctx, index) => messageBubble(
          chatdocs[index]['text'],
          chatdocs[index]['userId'] == futureSnapshot.data!.uid, //this is the error
          )
        );
        }
        );
    } );
ntjbwcob

ntjbwcob1#

更改此内容:

chatdocs[index]['userId'] == futureSnapshot.data!.uid, //this is the error

改为:

chatdocs[index]['userId'] = futureSnapshot.data!.uid,
zaqlnxep

zaqlnxep2#

您可以尝试json将您的变量解码为您要查找的User对象:如果futureSnapshot.data是用户,则可以使用uid作为Map键来检查chatdocs[index]['userId']
就像这样:

import 'dart:convert';

final Map<String, dynamic> _valueMap = json.decode(futureSnapshot.data!);

chatdocs[index]['userId'] == _valueMap['uid'];
yhxst69z

yhxst69z3#

因为你没有在你的FutureBuilder中声明Future的类型,它解析为Object,并且Object没有uid属性,这就是为什么你会得到这个错误。
要解决此问题,请声明FutureBuilder的类型,在您的示例中为:

return FutureBuilder<User>(

注意,我不知道为什么要在这里使用FutureBuilder,因为FirebaseAuth.instance.currentUser是一个同步值,所以不需要使用FutureBuilder来访问它,删除FutureBuilder也会得到完全相同的结果。
如果你想让你的代码响应身份验证状态的变化,比如当你启动应用时,Firebase需要一点时间来恢复用户的登录状态,那么现在你需要用StreamBuilder来监听authStateChanges,如获取当前用户文档中的第一个代码片段所示。你需要用User类型来声明你的StreamBuilder,就像我们上面对FutureBuilder所做的那样。

vuv7lop3

vuv7lop34#

请尝试以下代码:

StreamBuilder<QuerySnapshot>(
  stream: firestore.collection('chats').orderBy('timeStamp', descending: true).snapshots(),
  builder: (ctx, chatSnapshot) {
    if (chatSnapshot.connectionState == ConnectionState.waiting) {
      return const Center(
        child: CircularProgressIndicator(),
      );
    }

    final List<QueryDocumentSnapshot<Object?>> chatdocs = chatSnapshot.data!.docs;
    final String uid = FirebaseAuth.instance.currentUser?.uid ?? '';

    return ListView.builder(
      reverse: true,
      itemCount: chatdocs.length,
      itemBuilder: (ctx, index) {
        final Map<String, dynamic> chat = (chatdocs[index]).data() as Map<String, dynamic>;

        return messageBubble(
          chat['text'],
          chat['userId'] == uid,
        );
      },
    );
  },
),

相关问题