Flutter博客应用中如何获取Firebase Firestore文档ID实现评论系统?
问题分析与解决方案
错误原因
你同时混用了await和.then()/.catchError(),导致变量ref接收的是successAlert(context)的返回值(通常是void,也就是null),而非Firebase返回的DocumentReference对象,所以调用ref.id时触发了空指针错误。
修正方案
方案1:使用await + try/catch(推荐,代码可读性更高)
try { // 直接await add方法的结果,得到DocumentReference final ref = await FirebaseFirestore.instance .collection('blogs') .add({ 'title': titleController.text, 'body': myController.text, 'author': name, 'date': DateFormat('dd/MM/yyyy,hh:mm').format(DateTime.now()), }); // 操作成功后执行后续逻辑 successAlert(context); titleController.clear(); myController.clear(); print(ref.id); // 正常获取文档ID // 访问该文章的评论子集合 // ref.collection('comments').add(...) // 添加评论 // ref.collection('comments').get() // 查询评论 } catch (error) { errorAlert(context); }
方案2:使用.then()链式调用(不混用await)
如果更习惯链式调用写法,要确保在.then()的回调里处理文档ID:
FirebaseFirestore.instance .collection('blogs') .add({ 'title': titleController.text, 'body': myController.text, 'author': name, 'date': DateFormat('dd/MM/yyyy,hh:mm').format(DateTime.now()), }) .then((ref) { // 这里的ref是有效的DocumentReference successAlert(context); titleController.clear(); myController.clear(); print(ref.id); // 访问评论子集合 // ref.collection('comments') }) .catchError((error) => errorAlert(context));
访问评论子集合
获取到文档的DocumentReference(即上面的ref)后,直接调用ref.collection('comments')就能得到该文章对应的评论子集合引用,后续可以进行添加、查询评论等操作。
内容的提问来源于stack exchange,提问作者Devika
相关产品推荐
相关产品推荐

