На основе этой функции post throttleFirst
:
fun <T> throttleFirst(
skipMs: Long = 700L,
scope: CoroutineScope = viewModelScope,
action: (T) -> Unit
): (T) -> Unit {
var throttleJob: Job? = null
return { param: T ->
if (throttleJob?.isCompleted != false) {
throttleJob = coroutineScope.launch {
destinationFunction(param)
delay(skipMs)
}
}
}
}
Я использую это так:
Просмотреть
<Button
android:onClick="@{viewModel.myClickListener}"
.../>
Модель представления:
fun myClickListener() = View.OnClickListener { _ ->
throttleClick(clickAction = {
//do things
})
}
Базовая модель:
protected fun throttleClick(millis: Long = 700L, clickAction: (Unit) -> Unit): (Unit) -> Unit {
throttleFirst(millis, scope = viewModelScope, action = clickAction)
}
Но ничего не происходит, clickAction не достигается. Во время отладки пошаговое выполнение завершается, когда достигает return { param: T ->
, и эта возвращающая функция (throttleJob?.isCompleted
... код) никогда не вызывается.
Что я делаю неправильно?
EDIT с помощью Patrick окончательное решение:
Модель представления
private val myThrottleClick = throttleClick(clickAction = {
//do things
})
fun myClickListener() = View.OnClickListener { myThrottleClick(Unit) }
Базовая модель
protected fun throttleClick(millis: Long = 700L, clickAction: (Unit) -> Unit): (Unit) -> Unit {
return throttleFirst(millis, action = clickAction)
}
clickListener()
запрашивает у меня параметр. Я хотел бы использовать Unit, но не могу создать экземпляр void, так как же вы предлагаете решить эту незначительную деталь? 20.12.2019throttleFirst
, а вместо этого создам прокси/помощникthrottleClick
для ее использования. Тем не менее, следует следовать второму подходу :) Я был глуп, потому что вызывал clickListener(Unit()) вместо clickListener(Unit)... ^^ Большое спасибо, Патрик! 20.12.2019