Вызов типа функции Kotlin из Android с привязкой к данным - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть 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 через привязку данных, он не может скомпилироваться, так как он говорит, что cannot find method retryCallback() in class NetworkStateViewModel.

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

На данный момент я нашел одну работу, которую я опубликую отдельно в качестве ответа, но я хотел бы знать, могу ли я назвать это напрямую.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Просто позвоните invoke метод лямбда:

<Button
...
android:onClick="@{() -> viewModel.retryCallback.invoke()}"
... />
0 голосов
/ 26 апреля 2018

Обходной путь к этому - не вызывать тип функции напрямую, а вместо этого написать функцию, которая делает это:

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

    fun retry() {
        retryCallback()
    }

    ...
}

И в XML:

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