从前面的片段 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.