Я построил функцию для контроля положительных и отрицательных голосов в ответах.Точно так же, как он работает на SO.
Он отлично работает ластами - почти.
Если я позвоню один раз (нажав upvote или downvote), это вполне нормально, но если я позвоню еще раз(установите его в 0 из -1 или 1), он начинает работать вечно, прыгая через -1, 0 и 1 (я единственный пользователь, поэтому он не набирает больше 1 голоса).
Я могу 'не понимаю, что вызывает такое поведение.Я думаю, может быть, это как-то связано с тем, что он находится внутри слушателя, поэтому изменение значения продолжает зажигать функцию?Если это так, как мне получить нужное значение без слушателя?Я не уверен .. Помогите?
private fun executeVote(vote: String) {
val refVotes = FirebaseDatabase.getInstance().getReference("/votes/$answerId")
refVotes.addValueEventListener(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: DataSnapshot) {
val refUserVote = FirebaseDatabase.getInstance().getReference("/votes/$answerId/$uid")
if (p0.hasChild("$uid")) {
var voteValue = 0
refUserVote.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: DataSnapshot) {
voteValue = p0.getValue().toString().toInt()
when (voteValue) {
1 -> {
when (vote) {
"up" -> refUserVote.setValue(1)
"down" -> refUserVote.setValue(0)
else -> refUserVote.setValue(0)
}
}
0 -> {
when (vote) {
"up" -> refUserVote.setValue(1)
"down" -> refUserVote.setValue(-1)
else -> refUserVote.setValue(0)
}
}
-1 -> {
when (vote) {
"up" -> refUserVote.setValue(0)
"down" -> refUserVote.setValue(-1)
else -> refUserVote.setValue(0)
}
}
}
}
})
} else {
when (vote) {
"up" -> refUserVote.setValue(1)
"down" -> refUserVote.setValue(-1)
else -> refUserVote.setValue(0)
}
}
}
})
}