Kotlin Extension Functions Databinding

2020-06-07 01:48发布

Is there any possibility to use extension function with a databinding? XML:

<data>
    <import type="my.package.domain.country.model.City.streetName" />

    <variable
        name="city"
        type="my.package.domain.country.model.City" />
</data>

<TextView
    android:id="@+id/city"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{city.street.streetName()}" />

my.package.domain.country.model.city

data class City(
        val id: String,
        val street: Street
) 

fun City.streetName(): String = street.houseNumber

Error

[kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: Found data binding errors. ****/ data binding error ****msg:cannot find method streetName() in class my.package.domain.country.model.City

Thanks ;)

2条回答
虎瘦雄心在
2楼-- · 2020-06-07 02:23

You have to import CityKt firstly into xml

<import type="my.package.domain.country.model.CityKt" />

int the data section then you can use it like this

<TextView
  android:id="@+id/city"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="@{CityKt.streetName(city)}" />

If you review CityKt you will see that there is static Java method with City as first argument

查看更多
趁早两清
3楼-- · 2020-06-07 02:41

While @skiff2011 is correct, one could also use alias to prevent the Kt postfix.

For example, a certain extension function is located in ExtensionFunctionsKt can be aliased by ExtensionFunctions

<import
    alias="ExtensionFunctions"
    type="com.helloworld.app.util.ExtensionFunctionsKt" />

<variable
    name="someData"
    type="com.helloworld.app.model.SomeData" />

The ExtensionFunction alias can now be used to call the extension function. The first argument still needs to be the extended class variable.

<TextView
    android:id="@+id/city"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{ExtensionFunctions.doStuff(someData)}" />
查看更多
登录 后发表回答