我想统计输入PIN的尝试次数,并相应地显示通知:
val remainingPinCounter = remember { mutableStateOf(3) }
//
if(pinState == WRONG_PIN) {
remainingPinCounter.value--
showWrongPinNotification(remainingPinCounter)
}
@Composable
private fun showWrongPinNotification(retries: MutableStateOf<Int>){
if(retries.value > 0) Log.d("TAG", "Remaining Retries := $retries.value)
else Log.d("TAG", "All $retries.value attempts failed!)
//..
}
但是showWrongPinNotification()
是连续调用的,remainingPinCounter
增加到-无穷大,尽管我只通过pinState == WRONG_PIN
递减它?!我猜状态WRONG_PIN
没有改变,因此不断地用递减的值调用showWrongPinNotification
?
它在没有记忆的情况下正常工作->val remainingPinCounter = 3
if(pinState == WRONG_PIN) {
remainingPinCounter.value--
showWrongPinNotification(remainingPinCounter)
}
如果在下一次重新组合之前不更改pinState
,则可能是无限次重新组合。如果是这种情况,则调用每个重新组合条件块,并且remainingPinCounter
的值不断变化。
LaunchedEffect(pinState) {
if(pinState == WRONG_PIN) {
remainingPinCounter.value--
showWrongPinNotification(remainingPinCounter)
}
}
另一种选择是使用LaunchedEffect作为只减少一次