我正在尝试显示此聊天应用程序的主屏幕并添加消息发送时间

Posted

技术标签:

【中文标题】我正在尝试显示此聊天应用程序的主屏幕并添加消息发送时间【英文标题】:I am trying to display the home screen of this chat app and adding the time sent of messages 【发布时间】:2021-12-28 02:17:24 【问题描述】:

这是 message.dart,我遇到“字符串不是 bool 的子类型”的错误

'''

return StreamBuilder(

  stream: FirebaseFirestore.instance
      .collection("chats")
      .orderBy("time", descending: true)
      .snapshots(),
  builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) 
    if (snapshot.hasData) 
      var chatDoc = snapshot.data!.docs;

      return ListView.builder(
        reverse: false,
        itemCount: chatDoc.length,
        itemBuilder: (context, index) => messageBubble(
          chatDoc[index]['displayName'],
          chatDoc[index]['email'],
          chatDoc[index]['text'],
          chatDoc[index]['uid'] == currentUser,
          key: ValueKey<String>(chatDoc[index].id),
          time: chatDoc[index]['time'].toDate(),

        ),
      );

'''

这是 messageBubble.dart 函数

'''

class messageBubble extends StatelessWidget 
  final String message;
  final bool isMe;
  final String name;
  final String email;
  final DateTime time;
  final Key key;

  const messageBubble(this.message, this.isMe, this.name, this.email,
      required this.key, required this.time);

'''

【问题讨论】:

你能告诉我们messageBubble的实现吗? 对不起先生,我是 *** 的新手,如何在此处添加我的 messageBubble.dart 的代码? 要编辑一个问题,首先按下编辑按钮,接下来,为了编写代码,你需要放三个反引号字符(`),然后在一个新行上,复制粘贴你的代码,然后在另一个新行上另外三个反引号字符。 PS 目前你的问题是 100% 的代码,堆栈溢出是不允许的,我建议你在显示代码之前添加对代码和问题的深入解释。 请提供足够的代码,以便其他人更好地理解或重现问题。 完成,先生。如果您需要更多代码,请告诉我。谢谢你们 【参考方案1】:

好的,所以我建议每当你创建一个构造函数时,你总是使用命名参数来避免这种混乱。

您的messageBubble 构造函数按以下顺序接受以下参数:messageisMenameemail,并且您按此顺序传递信息:chatDoc[index]['displayName'], chatDoc[index]['email'], chatDoc[index]['text'], chatDoc[index]['uid'] == currentUser,

这意味着message 将是chatDoc[index]['displayName']isMe 将是chatDoc[index]['email'](这将是一个错误,因为我认为email 是一些字符串,但isMe 是一个布尔值)等等等等。

如我所说,要解决这个问题,我建议所有参数都命名为:

来自

const messageBubble(this.message, this.isMe, this.name, this.email,
      required this.key, required this.time);

const messageBubble(
  required this.message,
  required this.isMe, 
  required this.name,
  required this.email,
  required this.key, 
  required this.time);

这意味着在构造messageBubble时你会:

itemBuilder: (context, index) => messageBubble(
  name: chatDoc[index]['displayName'],
  email: chatDoc[index]['email'],
  text: chatDoc[index]['text'],
  isMe: chatDoc[index]['uid'] == currentUser,
  key: ValueKey<String>(chatDoc[index].id),
  time: chatDoc[index]['time'].toDate(),
),

当然,如果您不想这样做,只需修复参数的顺序即可解决问题:

itemBuilder: (context, index) => messageBubble(
  chatDoc[index]['text'],
  chatDoc[index]['uid'] == currentUser,
  chatDoc[index]['displayName'],
  chatDoc[index]['email'],
  key: ValueKey<String>(chatDoc[index].id),
  time: chatDoc[index]['time'].toDate(),
),

【讨论】:

【参考方案2】:

我会在此处包含完整的堆栈跟踪。看起来您的 chatDoc 中的某些内容是一个字符串,而您正试图将其传递给 bool 类型的内容。

【讨论】:

以上是关于我正在尝试显示此聊天应用程序的主屏幕并添加消息发送时间的主要内容,如果未能解决你的问题,请参考以下文章

当用户在聊天屏幕上时,如何使 FCM 通知不显示通知消息?

RecyclerView未正确显示消息列表

XMPP 聊天发送/接收消息同步

SetState 不适用于 listview.builder

UITableView分页,将显示无限加载

在聊天应用程序中使用 Web 套接字 Api 无法正确显示图像