Kotlin扩展函数数据绑定

use*_*105 19 mvvm kotlin extension-function

是否有可能使用数据绑定扩展功能?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()}" />
Run Code Online (Sandbox Code Playgroud)

my.package.domain.country.model.city

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

fun City.streetName(): String = street.houseNumber
Run Code Online (Sandbox Code Playgroud)

错误

[kapt]发生异常:android.databinding.tool.util.LoggedErrorException:发现数据绑定错误.****/数据绑定错误****msg:在类my.package.domain.country.model.City中找不到方法streetName()

谢谢 ;)

小智 33

您必须先将CityKt导入xml

<import type="my.package.domain.country.model.CityKt" />
Run Code Online (Sandbox Code Playgroud)

在数据部分中,您可以像这样使用它

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

如果您查看CityKt,您会看到有一个静态Java方法,其中City作为第一个参数


Exa*_*aqt 13

虽然@skiff2011 是正确的,但也可以alias用来防止Kt后缀。

例如,某个扩展函数位于ExtensionFunctionsKt可以被别名为ExtensionFunctions

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

<variable
    name="someData"
    type="com.helloworld.app.model.SomeData" />
Run Code Online (Sandbox Code Playgroud)

ExtensionFunction别名现在可以用来调用扩展功能。第一个参数仍然需要是扩展类变量。

<TextView
    android:id="@+id/city"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{ExtensionFunctions.doStuff(someData)}" />
Run Code Online (Sandbox Code Playgroud)


Tar*_*n A 7

扩展功能

前任:

fun Context.isDarkMode(): Boolean {

 }
Run Code Online (Sandbox Code Playgroud)

现在我们有了暗模式的扩展功能,可以使用上下文进行访问。

通常在 Kotlin 类中,我们可以使用上下文 obj 进行访问,如下所示。

context.isDarkMode()
Run Code Online (Sandbox Code Playgroud)

但在Xml中,我们无法像上面那样访问。

我们需要通过将 KT 附加到类来导入扩展函数。

例如)如果您的文件名是 Extensions,则导入应该是 ExtensionsKt。

在 xml 中像下面这样导入。

 <import type="com.example.extensions.ExtensionsKt" />
Run Code Online (Sandbox Code Playgroud)

然后我们可以像下面一样访问扩展函数,即我们需要传递我们为其创建扩展的对象,即在我们的例子中它是上下文。

  app:context='@{(ExtensionsKt.isDarkMode(context)}'
Run Code Online (Sandbox Code Playgroud)