从数据绑定Android调用Kotlin函数类型

从数据绑定Android调用Kotlin函数类型,android,kotlin,android-databinding,Android,Kotlin,Android Databinding,我有一个BaseObservable,我在数据绑定中使用它来显示网络状态。在这个类中,我传入了一个重试回调,我想在单击按钮时运行该回调: class NetworkStateViewModel(val retryCallback: () -> Unit) : BaseObservable() { var networkState: NetworkState? = null set(value) { field = value

我有一个BaseObservable,我在数据绑定中使用它来显示网络状态。在这个类中,我传入了一个重试回调,我想在单击按钮时运行该回调:

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时,它无法编译,因为它说在类NetworkStateViewModel中找不到方法retryCallback


到目前为止,我已经找到了一个解决方法,我将单独发布作为答案,但我想知道是否可以直接调用它。

解决方法之一是不直接调用函数类型,而是编写一个这样做的函数:

class NetworkStateViewModel(private val retryCallback: () -> Unit) : BaseObservable() {
    ...

    fun retry() {
        retryCallback()
    }

    ...
}
和XML格式:

<Button
    ...
    android:onClick="@{() -> viewModel.retry()}"
    ... />

解决此问题的一个方法是不直接调用函数类型,而是编写一个这样做的函数:

class NetworkStateViewModel(private val retryCallback: () -> Unit) : BaseObservable() {
    ...

    fun retry() {
        retryCallback()
    }

    ...
}
和XML格式:

<Button
    ...
    android:onClick="@{() -> viewModel.retry()}"
    ... />
只需调用lambda的invoke方法:

<Button
...
android:onClick="@{() -> viewModel.retryCallback.invoke()}"
... />
只需调用lambda的invoke方法:

<Button
...
android:onClick="@{() -> viewModel.retryCallback.invoke()}"
... />

谢谢你的建议!我得等到明天回到办公室再试试,但如果有用的话,我会回来接受的。谢谢你的建议!我得等到明天回到办公室再试试,但如果它管用的话,我会回来接受的。