【问题标题】:Attach context for base object of kotlin extension function为 kotlin 扩展函数的基础对象附加上下文
【发布时间】:2019-07-09 10:11:07
【问题描述】:

这个问题是针对Android开发中使用的Kotlin的扩展功能。

所以 Kotlin 为我们提供了将某些扩展行为添加到类中以扩展基础类行为的能力。

示例:(取自我当前的 Android 项目,用于在 Espresso 测试中的 viewAssertion)

fun Int.viewInteraction(): ViewInteraction {
    return onView(CoreMatchers.allOf(ViewMatchers.withId(this), ViewMatchers.isDisplayed()))
}

在我的用例中,我可以像这样使用它:

R.id.password_text.viewInteraction().perform(typeText(PASSWORD_PLAIN_TEXT), pressDone())

一切都好,除了这个扩展函数为所有Int对象提供了扩展行为,而不仅仅是Android中的View ID,这一点都不好。

问题是是否有任何方法可以为这个Int 提供上下文,就像在Android 中我们有@IdRes in Android support annotation 用于上述给定的情况?

【问题讨论】:

    标签: android kotlin extension-function


    【解决方案1】:

    您无法区分资源中的 Int 和普通 Int。它是同一个类,您正在为所有 Int 类型的类添加扩展。

    另一种方法是创建自己的 Int 包装器:

    class IntResource(val resource: Int) {
    
        fun viewInteraction(): ViewInteraction {
            return onView(CoreMatchers.allOf(ViewMatchers.withId(resource), ViewMatchers.isDisplayed()))
        }
    }
    

    然后我们是这样的:

    IntResource(R.id.password_text).viewInteraction().perform(typeText(PASSWORD_PLAIN_TEXT), pressDone())
    

    【讨论】:

    • 谢谢,是的,我正在寻找一种方法来支持注释,至少给我们一个无效使用的编译时警告。据我了解,这些扩展功能是作为编译阶段处理的。
    猜你喜欢
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    相关资源
    最近更新 更多