Firebase 颤振-从现有文档集合创建文档集合错误:path.isNotEmpty
请帮助我,我是Firebase的新手,在尝试从现有集合ID创建集合时出现消息错误 对话被创建了,聊天室也被创建了,但是我在大约10秒钟后看到了消息的出现和消失,似乎第二个功能并没有等待第一个功能 结构如下:Firebase 颤振-从现有文档集合创建文档集合错误:path.isNotEmpty,firebase,flutter,collections,cloud,document,Firebase,Flutter,Collections,Cloud,Document,请帮助我,我是Firebase的新手,在尝试从现有集合ID创建集合时出现消息错误 对话被创建了,聊天室也被创建了,但是我在大约10秒钟后看到了消息的出现和消失,似乎第二个功能并没有等待第一个功能 结构如下: 在“对话”集合中创建文档 正在获取该文档的ID 在“聊天室”集合中创建一个与 “对话”中的文档 下面是错误消息: 在生成chatPage时抛出了以下断言(脏,状态:_chatPageState#e5c15): 文档路径必须是非空字符串 'package:cloud\u firestore
- 在“对话”集合中创建文档
- 正在获取该文档的ID
- 在“聊天室”集合中创建一个与 “对话”中的文档
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);
});
谢谢您的帮助,它现在可以工作了,事实上,我没有把所有的代码都写出来,因为没有太清楚