【问题标题】:Kotlin stdlib and DatabindingKotlin 标准库和数据绑定
【发布时间】:2017-09-01 12:02:46
【问题描述】:

是否可以在 xml 中使用 Kotlin stdlib 中的方法?比如这段代码

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="16dp"
    android:textColor="#333333"
    android:text="@{viewModel.note}"
    android:visibility="@{viewModel.note.isNotEmpty ? View.VISIBLE : View.GONE}"/>

产生编译错误

任务“:app:compileDevDebugJavaWithJavac”执行失败。 java.lang.RuntimeException:发现数据绑定错误。 ****/ 数据绑定错误 ****msg:cannot find method isNotEmpty() in class java.lang.String 文件:D:\Projects\PushTracker-Android\app\src\main\res\layout\fragment_appointment_simple_details.xml 地点:104:44 - 104:70 ****\数据绑定错误****

很明显 databinding 试图在 Java 的 String 中找到方法 isNotEmpty() 但是我可以强制 databinding 编译器使用 kotlin 的 String 吗?

【问题讨论】:

    标签: java android data-binding kotlin android-databinding


    【解决方案1】:

    “kotlin 的字符串”不存在。 Kotlin 的标准库定义了扩展方法来创建您所指的方法。但是由于数据绑定库需要生成 Java 代码,所以它找不到您所指的方法。

    为了使用该方法,您需要使用 Java 调用它的方式调用它,即作为静态函数:

    kotlin.text.StringsKt.isNotEmpty(viewModel.note)

    编辑:此方法使用@InlineOnly 进行注释,因此此方法可能不存在于 Kotlin 代码之外。

    【讨论】:

    • 是的,我已经尝试过了,但也坚持使用@InlineOnly。据我了解,只有一种解决方案 - 使用 @JvmStatic 在一些辅助对象中定义此方法
    • @Google @JvmStatic 不是必需的,无论如何您都可以调用该方法。推荐的方法是使用文件级函数 thou,而不是对象方法。
    猜你喜欢
    • 2016-06-19
    • 2015-09-05
    • 2018-12-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 2017-11-06
    • 2019-04-05
    • 2018-09-28
    相关资源
    最近更新 更多