Firebase 颤振-从现有文档集合创建文档集合错误:path.isNotEmpty

Firebase 颤振-从现有文档集合创建文档集合错误:path.isNotEmpty,firebase,flutter,collections,cloud,document,Firebase,Flutter,Collections,Cloud,Document,请帮助我,我是Firebase的新手,在尝试从现有集合ID创建集合时出现消息错误 对话被创建了,聊天室也被创建了,但是我在大约10秒钟后看到了消息的出现和消失,似乎第二个功能并没有等待第一个功能 结构如下: 在“对话”集合中创建文档 正在获取该文档的ID 在“聊天室”集合中创建一个与 “对话”中的文档 下面是错误消息: 在生成chatPage时抛出了以下断言(脏,状态:_chatPageState#e5c15): 文档路径必须是非空字符串 'package:cloud\u firestore

请帮助我,我是Firebase的新手,在尝试从现有集合ID创建集合时出现消息错误

对话被创建了,聊天室也被创建了,但是我在大约10秒钟后看到了消息的出现和消失,似乎第二个功能并没有等待第一个功能

结构如下:

  • 在“对话”集合中创建文档
  • 正在获取该文档的ID
  • 在“聊天室”集合中创建一个与 “对话”中的文档
下面是错误消息:

在生成chatPage时抛出了以下断言(脏,状态:_chatPageState#e5c15): 文档路径必须是非空字符串 'package:cloud\u firestore/src/collection\u reference.dart': 断言失败:第59行第14位:“path.isNotEmpty”

这是我的密码:

class chatPage extends StatefulWidget {
  @override
  _chatPageState createState() => _chatPageState();

  static String conversationId = "";

}

  final CollectionReference conversationRef =
      FirebaseFirestore.instance.collection("Conversations");

Future<String> getConversationID() async {
    //Initialize Conversations collection
    final QuerySnapshot snapshot = await conversationRef.get();
    String convId = "";

    snapshot.docs.forEach((DocumentSnapshot doc) {
      if (doc["NumTel_Parent"] == OTPScreen.numTelParent &&
          doc["Rendu"] == "Null") {
        _isConv = true;
        print("Conversation already Exist");
        convId = doc.id;
      }
    });
    if (_isConv == false) {
      print("Adding conversation ...");
      await bambiDB().addConversation(OTPScreen.numTelParent, "Null", "Null");

      snapshot.docs.forEach((DocumentSnapshot doc1) {
        if (doc1["NumTel_Parent"] == OTPScreen.numTelParent &&
            doc1["Rendu"] == "Null") {
          _isConv = true;
          print("Conversation created");
          convId = doc1.id;
        }
      });
    }
    return convId;
  }

  createChatRoomMessageAuto() async {
      final CollectionReference chatRoomRef = FirebaseFirestore.instance
          .collection("ChatRoom")
          .doc(chatPage.conversationId)
          .collection("ChatRoomParent");

      final QuerySnapshot snapshot = await chatRoomRef.get();

      if (snapshot.docs.length == 0) {
        chatRoomRef.add({
          "Message": messageAuto1,
          "DateMessage": DateTime.now(),
          "Who": "Doctor"
        }).then((_) {
          print("auto1 created");
        }).catchError((_) {
          print("an error occured");
        });

        chatRoomRef.add({
          "Message": messageAuto2,
          "DateMessage": DateTime.now(),
          "Who": "Doctor"
        }).then((_) {
          print("auto2 created");
        }).catchError((_) {
          print("an error occured");
        });

        chatRoomRef.add({
          "Message": messageAuto3,
          "DateMessage": DateTime.now(),
          "Who": "Doctor"
        }).then((_) {
          print("auto3 created");
        }).catchError((_) {
          print("an error occured");
        });

        chatRoomRef.add({
          "Message": messageAuto4,
          "DateMessage": DateTime.now(),
          "Who": "Doctor"
        }).then((_) {
          print("auto4 created");
        }).catchError((_) {
          print("an error occured");
        });
      } else {
        print("Auto already created.");
      }
  }

 void creatingChatRoom() async {
    chatPage.conversationId = "";

    chatPage.conversationId = await getConversationID();

    createChatRoomMessageAuto();

    setState(() {});
  }

 @override
  void initState() {
    // TODO: implement initState
    super.initState();
    creatingChatRoom();
  }
class chatPage扩展StatefulWidget{
@凌驾
_chatPageState createState()=>\u chatPageState();
静态字符串conversationId=“”;
}
最终收集参考会话参考=
FirebaseFirestore.instance.collection(“对话”);
Future getConversationID()异步{
//初始化会话集合
final QuerySnapshot snapshot=wait conversationRef.get();
字符串convId=“”;
snapshot.docs.forEach((DocumentSnapshot doc){
如果(doc[“NumTel\u Parent”]==OTPScreen.numTelParent&&
单据[“人都”]=“空”){
_isConv=真;
打印(“对话已存在”);
convId=doc.id;
}
});
如果(_isConv==false){
打印(“添加对话…”);
wait bambiDB().addConversation(OTPScreen.numTelParent,“Null”,“Null”);
snapshot.docs.forEach((DocumentSnapshot doc1){
如果(doc1[“NumTel\u Parent”]==OTPScreen.numTelParent&&
doc1[“人都”]=“空”){
_isConv=真;
打印(“创建对话”);
convId=doc1.id;
}
});
}
返回convId;
}
createChatRoomMessageAuto()异步{
final CollectionReference chatRoomRef=FirebaseFirestore.instance
.收藏(“聊天室”)
.doc(chatPage.conversationId)
.收藏(“聊天室家长”);
final QuerySnapshot snapshot=wait chatRoomRef.get();
如果(snapshot.docs.length==0){
聊天室参考添加({
“Message”:messageAuto1,
“DateMessage”:DateTime.now(),
“谁”:“医生”
}).然后(){
打印(“自动1创建”);
}).catchError((){
打印(“发生错误”);
});
聊天室参考添加({
“Message”:messageAuto2,
“DateMessage”:DateTime.now(),
“谁”:“医生”
}).然后(){
打印(“自动创建2”);
}).catchError((){
打印(“发生错误”);
});
聊天室参考添加({
“Message”:messageAuto3,
“DateMessage”:DateTime.now(),
“谁”:“医生”
}).然后(){
打印(“自动创建3”);
}).catchError((){
打印(“发生错误”);
});
聊天室参考添加({
“Message”:messageAuto4,
“DateMessage”:DateTime.now(),
“谁”:“医生”
}).然后(){
打印(“自动创建4”);
}).catchError((){
打印(“发生错误”);
});
}否则{
打印(“已自动创建”);
}
}
无效创建聊天室()异步{
chatPage.conversationId=“”;
chatPage.conversationId=等待getConversationID();
createChatRoomMessageAuto();
setState((){});
}
@凌驾
void initState(){
//TODO:实现initState
super.initState();
创建聊天室();
}

欢迎来到SO!我很难完全理解代码。似乎缺少了一些,特别是
\u chatPageState()
的完整定义。作为未来问题的提示,如果您可以尽可能将代码剥离回简化的示例中,您通常会发现更容易获得回答

我的第一个想法是:如果
conversationId
\u chatPageState
中的一个值,而不是
chatPage
的一个静态属性,那么它是否有效

我的第二个想法是:如果像这样链接这两个异步函数,它会工作吗

getConversationID()。然后((id){
chatPage.conversationId=id;
createChatRoomMessageAuto();
});
如果后者有效,您甚至可能根本不需要存储
conversationId
,因为您可以直接将其传递到
createChatRoomMessageAuto
函数,如

getConversationID()。然后((id){
createChatRoomMessageAuto(id);
});

谢谢您的帮助,它现在可以工作了,事实上,我没有把所有的代码都写出来,因为没有太清楚