Flutter+Firebase聊天应用:Firestore消息集合缺失接收者邮箱
Flutter + Firebase聊天应用:Firestore未存储receiverEmail字段问题
我正在开发一款基于Flutter和Firebase的聊天应用,尝试保存并检索包含接收者邮箱的用户消息,但Firestore的messages集合中始终不显示receiverEmail字段。
代码实现(ChatPage.dart)
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; class ChatPage extends StatefulWidget { static const String screenRoute = "ChatPage"; @override _ChatPageState createState() => _ChatPageState(); } class _ChatPageState extends State<ChatPage> { late User? signedInUser; TextEditingController _messageController = TextEditingController(); @override void initState() { super.initState(); getSignedInUser(); } void getSignedInUser() { final user = FirebaseAuth.instance.currentUser; setState(() { signedInUser = user; }); } Future<void> sendMessage(String message, String receiverEmail) async { try { if (signedInUser != null) { final messageData = { 'message': message, 'senderId': signedInUser!.uid, 'senderEmail': signedInUser!.email, 'receiverEmail': receiverEmail, 'timestamp': Timestamp.now(), }; await FirebaseFirestore.instance.collection('messages').add(messageData); _messageController.clear(); } } catch (e) { print('Error sending message: $e'); } } String formatLastSeen(DateTime lastSeen) { Duration difference = DateTime.now().difference(lastSeen); if (difference.inDays > 0) { return 'Last seen ${difference.inDays} days ago'; } else if (difference.inHours > 0) { return 'Last seen ${difference.inHours} hours ago'; } else if (difference.inMinutes > 0) { return 'Last seen ${difference.inMinutes} minutes ago'; } else { return 'Last seen just now'; } } @override Widget build(BuildContext context) { final args = ModalRoute.of(context)!.settings.arguments as Map<String, dynamic>; final name = args['name']; final imageLink = args['ImageLink']; final lastSeenTimestamp = args['lastSeen']; final receiverEmail = args['receiverEmail']; // Convert Firestore Timestamp to DateTime DateTime? lastSeenDateTime; if (lastSeenTimestamp != null && lastSeenTimestamp is Timestamp) { lastSeenDateTime = lastSeenTimestamp.toDate(); } return Scaffold( appBar: AppBar( leading: CircleAvatar( backgroundImage: NetworkImage(imageLink), ), title: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(name), Text( lastSeenDateTime != null ? formatLastSeen(lastSeenDateTime) : 'Last seen unknown', style: TextStyle(fontSize: 12), ), ], ), ), body: Column( children: [ Expanded( child: StreamBuilder<QuerySnapshot>( stream: FirebaseFirestore.instance .collection('messages') .orderBy('timestamp', descending: false) .snapshots(), builder: (context, snapshot) { if (!snapshot.hasData) { return Center( child: CircularProgressIndicator(backgroundColor: Colors.blue), ); } final messages = snapshot.data!.docs; return ListView.builder( itemCount: messages.length, itemBuilder: (context, index) { final message = messages[index]; final messageText = message['message']; final senderId = message['senderId']; final isMe = signedInUser?.uid == senderId; return MessageReplay( sendmessage: messageText, isMe: isMe, ); }, ); }, ), ), Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ Expanded( child: TextField( controller: _messageController, decoration: InputDecoration( hintText: 'Type a message...', ), ), ), IconButton( icon: Icon(Icons.send), onPressed: () { final message = _messageController.text.trim(); if (message.isNotEmpty) { sendMessage(message, receiverEmail); } }, ), ], ), ), ], ), ); } } class MessageReplay extends StatelessWidget { final String? sendmessage; final bool isMe; const MessageReplay({Key? key, this.sendmessage, required this.isMe}) : super(key: key); @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(10.0), child: Column( crossAxisAlignment: isMe ? CrossAxisAlignment.end : CrossAxisAlignment.start, children: [ Material( elevation: 5, borderRadius: BorderRadius.only( topLeft: Radius.circular(30), bottomLeft: isMe ? Radius.circular(30) : Radius.circular(0), bottomRight: isMe ? Radius.circular(0) : Radius.circular(30), topRight: Radius.circular(30), ), color: isMe ? Colors.blue : Colors.white, child: Padding( padding: const EdgeInsets.all(12.0), child: Text( sendmessage ?? 'Message not found', style: TextStyle(fontSize: 15, color: isMe ? Colors.white : Colors.black), ), ), ), ], ), ); } }
Firestore集合截图

已执行操作
- 通过ModalRoute向ChatPage传递并获取接收者邮箱参数
- 发送消息时将
receiverEmail字段加入messageData映射
预期与实际行为
- 预期:
receiverEmail字段应与其他消息数据一同存储在Firestore中 - 实际:Firestore消息集合中缺失该字段
内容的提问来源于stack exchange,提问作者Hussien990
相关产品推荐
相关产品推荐

