从数据绑定调用 Kotlin 函数类型 Android
Calling Kotlin function type from databinding Android
我有一个 BaseObservable
用于数据绑定以显示网络状态。在此 class 中,我传入了一个重试回调,每当单击按钮时我都想 运行:
class NetworkStateViewModel(val retryCallback: () -> Unit) : BaseObservable() {
var networkState: NetworkState? = null
set(value) {
field = value
notifyChange()
}
val isLoading: Boolean
@Bindable get() = networkState is NetworkState.Loading
val isShowingError: Boolean
@Bindable get() = networkState is NetworkState.Error
val errorText: String
@Bindable get() = (networkState as? NetworkState.Error)?.error?.message.orEmpty()
}
但是,当我尝试通过数据绑定引用 retryCallback
时,它无法编译,因为它说它是 cannot find method retryCallback() in class NetworkStateViewModel
。
<Button
...
android:onClick="@{() -> viewModel.retryCallback()}"
... />
到目前为止我已经找到了一个解决方法,我将 post 单独作为答案,但我想知道我是否可以直接调用它。
解决这个问题的一个方法是不直接调用函数类型,而是编写一个这样做的函数:
class NetworkStateViewModel(private val retryCallback: () -> Unit) : BaseObservable() {
...
fun retry() {
retryCallback()
}
...
}
在XML中:
<Button
...
android:onClick="@{() -> viewModel.retry()}"
... />
只需调用 lambda 的 invoke
方法:
<Button
...
android:onClick="@{() -> viewModel.retryCallback.invoke()}"
... />
我有一个 BaseObservable
用于数据绑定以显示网络状态。在此 class 中,我传入了一个重试回调,每当单击按钮时我都想 运行:
class NetworkStateViewModel(val retryCallback: () -> Unit) : BaseObservable() {
var networkState: NetworkState? = null
set(value) {
field = value
notifyChange()
}
val isLoading: Boolean
@Bindable get() = networkState is NetworkState.Loading
val isShowingError: Boolean
@Bindable get() = networkState is NetworkState.Error
val errorText: String
@Bindable get() = (networkState as? NetworkState.Error)?.error?.message.orEmpty()
}
但是,当我尝试通过数据绑定引用 retryCallback
时,它无法编译,因为它说它是 cannot find method retryCallback() in class NetworkStateViewModel
。
<Button
...
android:onClick="@{() -> viewModel.retryCallback()}"
... />
到目前为止我已经找到了一个解决方法,我将 post 单独作为答案,但我想知道我是否可以直接调用它。
解决这个问题的一个方法是不直接调用函数类型,而是编写一个这样做的函数:
class NetworkStateViewModel(private val retryCallback: () -> Unit) : BaseObservable() {
...
fun retry() {
retryCallback()
}
...
}
在XML中:
<Button
...
android:onClick="@{() -> viewModel.retry()}"
... />
只需调用 lambda 的 invoke
方法:
<Button
...
android:onClick="@{() -> viewModel.retryCallback.invoke()}"
... />