Прикрепить контекст для базового объекта функции расширения kotlin - PullRequest
2 голосов
/ 09 июля 2019

Этот вопрос относится к функции расширения Kotlin, используемой в разработке для Android.

Таким образом, Kotlin предоставляет нам возможность добавить определенное поведение расширения в класс для расширения поведения базового класса.

Пример: (возьмите из моего текущего проекта Android, для viewAssertion в тестировании с Espresso)

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

В моем случае я могу использовать его как:

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

Все хорошо, кроме этогоФункция extension обеспечивает расширенное поведение для всех Int объектов, а не только для идентификаторов View в Android, что совсем нехорошо.

Вопрос в том, существует ли какой-либо способ дать контекст для этого Intкак в Android у нас есть @ IdRes в аннотации поддержки Android для указанного выше случая?

1 Ответ

1 голос
/ 09 июля 2019

Вы не можете отличить 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())
...