Kotlin扩展函数数据绑定

时间:2018-04-18 11:32:42

标签: 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()}" />

my.package.domain.country.model.city

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

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

错误

  

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

谢谢;)

4 个答案:

答案 0 :(得分:17)

您必须首先将CityKt导入xml

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

int数据部分 那么你可以像这样使用它

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

如果查看CityKt,您将看到存在以City为第一个参数的静态Java方法

答案 1 :(得分:6)

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

例如,位于ExtensionFunctionsKt中的某个扩展功能可以由ExtensionFunctions作为别名

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

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

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

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

答案 2 :(得分:1)

如果使用 Utils 类,您可以:

 object Utils(){
       fun streetName(): String {}
}

<import
    type="com.helloworld.app.util.Utils" />



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

答案 3 :(得分:1)

扩展功能

例如:

fun Context.isDarkMode(): Boolean {

 }

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

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

context.isDarkMode()

但是在Xml中,我们不能像上面那样访问。

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

Ex) 如果您的文件名为 Extensions,则导入应为 ExtensionsKt。

像下面这样在 xml 中导入。

 <import type="com.paytmmoney.core.extensions.ExtensionsKt" />

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

  app:context='@{(ExtensionsKt.isDarkMode(context)}'