Kotlin 扩展函数数据绑定
Kotlin Extension Functions 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
错误
[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
谢谢 ;)
您必须先将 CityKt 导入 xml
<import type="my.package.domain.country.model.CityKt" />
整合数据部分
然后你可以像这样使用它
<TextView
android:id="@+id/city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{CityKt.streetName(city)}" />
如果您查看 CityKt,您会发现有一个以 City 作为第一个参数的静态 Java 方法
虽然@skiff2011 是正确的,但也可以使用 alias
来防止 Kt
后缀。
比如某个扩展函数位于ExtensionFunctionsKt
可以别名为ExtensionFunctions
<import
alias="ExtensionFunctions"
type="com.helloworld.app.util.ExtensionFunctionsKt" />
<variable
name="someData"
type="com.helloworld.app.model.SomeData" />
ExtensionFunction
别名现在可用于调用扩展函数。第一个参数仍然需要是扩展的 class 变量。
<TextView
android:id="@+id/city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{ExtensionFunctions.doStuff(someData)}" />
如果使用 Utils class 你可以这样做:
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()}"
/>
扩展函数
例如:
fun Context.isDarkMode(): Boolean {
}
现在我们有暗模式的扩展功能,可以使用上下文访问。
通常在 Kotlin 中 class 我们可以像下面这样使用 context obj 进行访问。
context.isDarkMode()
但是在Xml中,我们不能像上面那样访问。
我们需要通过将 KT 附加到 class 来导入扩展功能。
Ex)如果你的文件名是Extensions,那么导入应该是ExtensionsKt。
在 xml 中像下面那样导入。
<import type="com.paytmmoney.core.extensions.ExtensionsKt" />
然后我们可以像下面那样访问扩展函数,即我们需要传递我们正在为其创建扩展的对象,即在我们的例子中它是上下文。
app:context='@{(ExtensionsKt.isDarkMode(context)}'
是否有可能将扩展函数与数据绑定一起使用? 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] 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
谢谢 ;)
您必须先将 CityKt 导入 xml
<import type="my.package.domain.country.model.CityKt" />
整合数据部分 然后你可以像这样使用它
<TextView
android:id="@+id/city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{CityKt.streetName(city)}" />
如果您查看 CityKt,您会发现有一个以 City 作为第一个参数的静态 Java 方法
虽然@skiff2011 是正确的,但也可以使用 alias
来防止 Kt
后缀。
比如某个扩展函数位于ExtensionFunctionsKt
可以别名为ExtensionFunctions
<import
alias="ExtensionFunctions"
type="com.helloworld.app.util.ExtensionFunctionsKt" />
<variable
name="someData"
type="com.helloworld.app.model.SomeData" />
ExtensionFunction
别名现在可用于调用扩展函数。第一个参数仍然需要是扩展的 class 变量。
<TextView
android:id="@+id/city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{ExtensionFunctions.doStuff(someData)}" />
如果使用 Utils class 你可以这样做:
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()}"
/>
扩展函数
例如:
fun Context.isDarkMode(): Boolean {
}
现在我们有暗模式的扩展功能,可以使用上下文访问。
通常在 Kotlin 中 class 我们可以像下面这样使用 context obj 进行访问。
context.isDarkMode()
但是在Xml中,我们不能像上面那样访问。
我们需要通过将 KT 附加到 class 来导入扩展功能。
Ex)如果你的文件名是Extensions,那么导入应该是ExtensionsKt。
在 xml 中像下面那样导入。
<import type="com.paytmmoney.core.extensions.ExtensionsKt" />
然后我们可以像下面那样访问扩展函数,即我们需要传递我们正在为其创建扩展的对象,即在我们的例子中它是上下文。
app:context='@{(ExtensionsKt.isDarkMode(context)}'