Kotlin数据绑定与扩展方法

时间:2018-10-01 10:37:54

标签: android kotlin kotlin-android-extensions kotlin-extension

我正在尝试在Android的数据绑定中使用Kotlin扩展方法。例如;调用onclick处理程序。所以我编写了这段代码:

posttest_list_item.xml

<?xml version="1.0" encoding="utf-8"?>

<data>
    <import type="android.view.View"/>
    <import type="com.example.test.post.posttest.PostTestItemViewModelExtensionKt" />
    <variable
        name="viewModel"
        type="com.example.test.post.posttest.PostTestItemViewModel" />
</data>
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:clickable="true"
    android:onClick="@{(view) -> viewModel.clicked(view)}"
    >
[...]

PostTestItemViewModel.kt

open class PostTestItemViewModel : ViewModel() {
    val postTitle = MutableLiveData<String>()
    val postBody = MutableLiveData<String>()

   /**
    * Binds the required properties/entities to this ViewModel
    */
   fun bind(post: Post) {
       postTitle.value = post.title
       postBody.value = post.body
   }
}

PostTestItemViewModelExtension.kt

fun PostTestItemViewModel.clicked(v: View) {
    this.postTitle.value = "clicked"
}

因此,当我将clicked方法放置在viewmodel内时,它可以按应有的方式完美工作。但是,当我将其创建为扩展方法时,在编译时会出现以下错误:

  

e:[kapt]发生了异常:android.databinding.tool.util.LoggedErrorException:发现了数据绑定错误。   在类... PostItemViewModel中找不到方法clicked(android.view.View)方法

我已经尝试了其他方法,例如将android:onclick标记更改为PostTestItemViewModelExtensionKt而不是viewModel。不幸的是,所有事情似乎都不起作用。因此,看起来像是在数据绑定之后生成了扩展方法。有办法解决还是我做错了什么?还是无法绑定扩展方法?

我正在使用Kotlin版本1.2.71,gradle 3.2.0,并在我的.gradle中添加了databinding { enabled = true }kapt { generateStubs = true },并插入了kotlin-android,{{1 }}和kotlin-android-extensions定义。

1 个答案:

答案 0 :(得分:2)

很遗憾,您不能将扩展方法用作onClick回调。

Kotlin中的扩展方法是作为Java静态方法创建的,而Android框架则需要一个实例方法。

请注意,在Android Studio中,您可以将Kotlin类反编译为Java,以查看生成的Java代码。