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 ;)
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
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)}" />