我已经在viewModel中创建了一个函数来检查文档是否已存在于Firestore数据库中
fun isUserRegistered() {
val userRef = firebaseRepository.firestoreDB.collection("users").document(firebaseRepository.userid.toString())
userRef.get()
.addOnSuccessListener { document ->
if (document != null)
userExists = true
}
}
如果文档存在,则布尔值userExists应该从“ false”更改为“ true”
在我的片段中,我在onActivityResultMethod中调用该函数
viewModel.isUserRegistered()
if(viewModel.userExists)
findNavController().navigate(R.id.action_startFragment_to_mainFragment)
userExists的值始终为“ false”。我在哪里犯错了?
答案 0 :(得分:1)
问题在于get()
是异步的,并且在查询完成之前立即返回。您的成功侦听器要到一段时间后才会被调用。您无法保证需要多长时间。
您的第二段代码可能正在尝试在监听器中分配userExists
之前对其进行访问,这意味着它将看到false
的默认值。
由于您不知道get()
将花费多长时间,因此您应该研究使用LiveData捕获结果,并编写代码观察该LiveData以便在查询查询完成时知道。
答案 1 :(得分:0)
您可以使用 .where( field, isEqualTo: 查询)。这可能对您有用。
checkExists(String query) async {
QuerySnapshot checker = await userRef
.where('uid', isEqualTo: query)
.get();
chkr.docs.forEach((doc) {
if (doc.exists) {
print('Exists');
print(doc.get('uid'));
}else {
print('false');
}
});
}
然后,如果您使用按钮,则可以使用 onPressed: () => check(yourQuery)。