Debounce Mutation State Policy

Author: Pablisco

This is an alternate method of debouncing state changes in Jetpack Compose.

Using this technique, you can leverage a custom SnapshotMutationPolicy to accomplish the same debouncing behavior. The main difference is that this approach uses the default mutableStateOf implementation with a custom mutation policy instead.

/**
* Returns a [SnapshotMutationPolicy] implementation that applies a debounce mechanism to mutation events.
*
* @param debounceTime The time window in milliseconds within which mutation events are considered to be the same.
* @return An instance of [SnapshotMutationPolicy] that applies a debounce mechanism.
*
* @param T The type of the snapshot.
*/
fun <T> debounceMutationPolicy(
debounceTime: Long = 500,
): SnapshotMutationPolicy<T> = object : SnapshotMutationPolicy<T> {
var lastUpdate = 0L
override fun equivalent(a: T, b: T): Boolean = checkEquivalence(a, b).also { updateIfNeeded() }
private fun updateIfNeeded() = apply { if (isUpdateTime()) lastUpdate = now() }
private fun checkEquivalence(a: T, b: T): Boolean = if (isUpdateTime()) a == b else CancelMutation
private fun isUpdateTime() = now() - lastUpdate > debounceTime
}
/**
* Determines whether a mutation should be canceled or not.
*
* The value of this property determines whether a mutation should be canceled or not based on the conditions defined
* in the "checkEquivalence" function.
* If CancelMutation is set to `true`, the "checkEquivalence" function will return `true` if the time between the last
* update and the current time is greater than the debounce time.
*
* Otherwise, it will return the result of the equality comparison between the two provided values.
*/
private const val CancelMutation = true
mutableStateOf(initialValue, debounceMutationPolicy())
view raw usage.kt hosted with ❤ by GitHub

It’s a great reminder that in coding, flexibility is key. Whether you choose to extend MutableState or use a custom mutation policy, you’ve got options to tailor your state management to your needs.

Have a project you'd like to submit? Fill this form, will ya!

If you like this snippet, you might also like:

Maker OS is an all-in-one productivity system for developers

I built Maker OS to track, manage & organize my life. Now you can do it too!