【问题标题】:Kotlin Extension Functions DatabindingKotlin 扩展函数数据绑定
【发布时间】:2018-09-28 15:13:40
【问题描述】:

是否有可能将扩展功能与数据绑定一起使用? 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()

谢谢 ;)

【问题讨论】:

    标签: mvvm kotlin extension-function


    【解决方案1】:

    扩展功能

    例如:

    fun Context.isDarkMode(): Boolean {
    
     }
    

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

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

    context.isDarkMode()
    

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

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

    Ex)如果你的文件名是Extensions,那么import应该是ExtensionsKt。

    在 xml 中导入如下。

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

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

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

    【讨论】:

      【解决方案2】:

      如果使用 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】:

        虽然@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)}" />
        

        【讨论】:

          【解决方案4】:

          你必须先将 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,您会发现有一个静态 Java 方法,其中 City 作为第一个参数

          【讨论】:

          • 感谢您,将我的扩展调用包装在模型类中。节省大量时间!
          • 实例方法也可以与数据绑定一起使用吗?
          猜你喜欢
          • 2018-10-17
          • 2019-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-03
          • 1970-01-01
          相关资源
          最近更新 更多