You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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集合截图

Messages集合截图

已执行操作

  • 通过ModalRoute向ChatPage传递并获取接收者邮箱参数
  • 发送消息时将receiverEmail字段加入messageData映射

预期与实际行为

  • 预期:receiverEmail字段应与其他消息数据一同存储在Firestore中
  • 实际:Firestore消息集合中缺失该字段

内容的提问来源于stack exchange,提问作者Hussien990

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:56:00