为Kotlin扩展功能的基础对象附加上下文

时间:2019-07-09 10:11:07

标签: android kotlin extension-function

这个问题专门针对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吗?

1 个答案:

答案 0 :(得分: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())