从前面的片段 firebase android kotlin 调用函数 onDataChange()
Function onDataChange() is called from the previous fragment firebase android kotlin
我 运行 遇到了一个相当难 运行 的问题。在我的片段中有一段代码,用于通过 child().setValue()
将项目添加到数据库。在另一个片段中有用户授权,它检查用户是否存在,它也是使用onDataChange()
函数实现的。
检查用户函数[AuthFragment]:
private fun checkUserExist() {
val ref = FirebaseDatabase.getInstance().getReference("Users")
ref.child(auth.uid!!)
.addValueEventListener(object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()) {
// User exist
findNavController().navigate(R.id.action_authSecondStepFragment_to_authCompletedFragment)
} else {
// User not exist
saveUser()
}
}
override fun onCancelled(error: DatabaseError) {
throw error.toException()
}
})
}
将项目添加到数据库函数[AddingToDatabaseFragment]:
private fun addToFavorite() {
val hashMap = HashMap<String, Any>()
with(args) {
hashMap["id"] = getPlaceId()
hashMap["name"] = currentPlace.name
hashMap["location"] = currentPlace.description
hashMap["image"] = currentPlace.image
hashMap["description"] = currentPlace.description
}
val ref = FirebaseDatabase.getInstance().getReference("Users")
ref.child(getProfileUid()!!)
.child("Favorites")
.child(getPlaceId())
.setValue(hashMap)
.addOnSuccessListener {
Toast.makeText(requireContext(), "Succesfully added!", Toast.LENGTH_SHORT).show()
}
.addOnFailureListener {
Toast.makeText(requireContext(), "Error!", Toast.LENGTH_SHORT).show()
}
}
实际上,问题是当通过onDataChange()
函数成功授权时,我进入了另一个片段,在那里我已经可以将一些项目添加到数据库中,并且在添加(分别更改数据库)时,来自 PREVIOUS 授权片段的 onDataChange()
函数,在我的例子中 findNavController()
是从我什至不在其中的片段调用的,这导致应用程序碰撞。我该如何解决这个问题?
由于您使用 addValueEventListener
,您正在注册一个永久监听器。停用该侦听器的唯一方法是 detaching 它,通常是在它超出范围时。
我通常会尝试将听众的附加和分离放在活动的相反 life-cycle 事件中。因此,如果我在 onStart
中附加,我将在 onStop
中分离,对于 onUnpause
/onResume
。
也是如此
对于片段你应该遵循相同的逻辑,所以 onAttach
-> onDetach
,或 onStart
-> onStop
,或 onPause
-> onResume
.
我 运行 遇到了一个相当难 运行 的问题。在我的片段中有一段代码,用于通过 child().setValue()
将项目添加到数据库。在另一个片段中有用户授权,它检查用户是否存在,它也是使用onDataChange()
函数实现的。
检查用户函数[AuthFragment]:
private fun checkUserExist() {
val ref = FirebaseDatabase.getInstance().getReference("Users")
ref.child(auth.uid!!)
.addValueEventListener(object: ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()) {
// User exist
findNavController().navigate(R.id.action_authSecondStepFragment_to_authCompletedFragment)
} else {
// User not exist
saveUser()
}
}
override fun onCancelled(error: DatabaseError) {
throw error.toException()
}
})
}
将项目添加到数据库函数[AddingToDatabaseFragment]:
private fun addToFavorite() {
val hashMap = HashMap<String, Any>()
with(args) {
hashMap["id"] = getPlaceId()
hashMap["name"] = currentPlace.name
hashMap["location"] = currentPlace.description
hashMap["image"] = currentPlace.image
hashMap["description"] = currentPlace.description
}
val ref = FirebaseDatabase.getInstance().getReference("Users")
ref.child(getProfileUid()!!)
.child("Favorites")
.child(getPlaceId())
.setValue(hashMap)
.addOnSuccessListener {
Toast.makeText(requireContext(), "Succesfully added!", Toast.LENGTH_SHORT).show()
}
.addOnFailureListener {
Toast.makeText(requireContext(), "Error!", Toast.LENGTH_SHORT).show()
}
}
实际上,问题是当通过onDataChange()
函数成功授权时,我进入了另一个片段,在那里我已经可以将一些项目添加到数据库中,并且在添加(分别更改数据库)时,来自 PREVIOUS 授权片段的 onDataChange()
函数,在我的例子中 findNavController()
是从我什至不在其中的片段调用的,这导致应用程序碰撞。我该如何解决这个问题?
由于您使用 addValueEventListener
,您正在注册一个永久监听器。停用该侦听器的唯一方法是 detaching 它,通常是在它超出范围时。
我通常会尝试将听众的附加和分离放在活动的相反 life-cycle 事件中。因此,如果我在 onStart
中附加,我将在 onStop
中分离,对于 onUnpause
/onResume
。
对于片段你应该遵循相同的逻辑,所以 onAttach
-> onDetach
,或 onStart
-> onStop
,或 onPause
-> onResume
.