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

Flutter聊天应用无法将数据写入Cloud Firestore求助

Flutter聊天应用无法将消息写入Cloud Firestore

我跟着课程用Flutter开发聊天应用,已经按步骤配置了Cloud Firestore,但消息数据始终写不进去。

我的代码

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';

class ChatScreen extends StatefulWidget {
  const ChatScreen({super.key});
  static const String screenRoute = "chat_screen";

  @override
  State<ChatScreen> createState() => _ChatScreenState();
}

class _ChatScreenState extends State<ChatScreen> {
  final _fireStore = FirebaseFirestore.instance;
  final _auth = FirebaseAuth.instance;
  late User signInUser;
  String? messageText;

  @override
  void initState() {
    super.initState();
    getCurrentUser();
  }

  void getCurrentUser() {
    try {
      final user = _auth.currentUser;
      if (user != null) {
        signInUser = user;
        print(signInUser.email);
      }
    } catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.orange,
        title: Text(
          "messages",
        ),
        actions: [
          IconButton(
              onPressed: () {
                _auth.signOut();
                Navigator.pop(context);
              },
              icon: Icon(Icons.close)),
        ],
      ),
      body: SafeArea(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.end,
          children: [
            Container(
              padding: EdgeInsets.only(left: 5),
              child: Row(
                children: [
                  Expanded(
                    child: TextField(
                      onChanged: (value) {
                        messageText = value;
                      },
                      decoration: InputDecoration(
                        hintText: "Write your message here...",
                        hintStyle: TextStyle(fontSize: 22),
                      ),
                    ),
                  ),
                  TextButton(
                    onPressed: () {
                      _fireStore.collection("message").add({
                        "name": messageText,
                        "email": signInUser.email,
                      });
                    },
                    child: Text(
                      "Send",
                      style: TextStyle(fontSize: 20),
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

Cloud Firestore规则

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    match /messages/{document} {
      allow read, write: if true;
    }
  }
}

问题排查与修复方案

1. 核心问题:集合名称不匹配

代码中调用的集合是"message"(单数),但Firestore规则中配置的是/messages/{document}(复数)。Firestore对集合名称的拼写严格区分,且规则仅匹配指定路径的集合,因此当前代码的写入请求未被规则允许,导致数据无法写入。

修复: 将代码中的集合名称改为"messages":

_fireStore.collection("messages").add({
  "name": messageText,
  "email": signInUser.email,
});

2. 补充优化建议

  • 空值校验:点击Send按钮前,检查输入内容和用户状态是否有效,避免无效请求;
  • 错误捕获:添加异常捕获,打印错误信息便于排查问题;
  • 清空输入框:发送消息后清空输入框,提升用户体验。

修改后的Send按钮代码:

TextButton(
  onPressed: () async {
    // 校验输入内容和用户状态
    if (messageText?.trim().isEmpty == true || signInUser.email == null) {
      return;
    }
    try {
      await _fireStore.collection("messages").add({
        "name": messageText,
        "email": signInUser.email,
      });
      // 发送后清空输入框
      setState(() {
        messageText = "";
      });
    } catch (e) {
      print("写入Firestore失败: $e");
    }
  },
  child: Text(
    "Send",
    style: TextStyle(fontSize: 20),
  ),
),

3. 其他检查项

  • 确认Firebase项目已正确关联到Flutter应用,google-services.json(Android)或GoogleService-Info.plist(iOS)文件已正确放置;
  • 确认设备网络连接正常;
  • 可在Firebase控制台的"规则"页面,临时开启测试模式(allow read, write: if request.time < timestamp.date(2025, 1, 1);)验证是否为规则问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:00:56