3 votes

Attacher un contexte à l'objet de base de la fonction d'extension kotlin

Cette question est spécifique à la fonction d'extension de Kotlin utilisée dans le développement d'Android.

Kotlin nous offre donc la possibilité d'ajouter certains comportements d'extension à une classe afin d'étendre le comportement de la classe de base.

Exemple : (tiré de mon projet Android actuel, pour viewAssertion en test avec Espresso)

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

Dans mon cas, je peux l'utiliser comme suit :

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

Tout va bien, sauf que cette fonction d'extension donne le comportement étendu à tous les utilisateurs. Int et pas seulement les View ID dans Android, ce qui n'est pas bon du tout.

La question est de savoir s'il existe un moyen de donner un contexte à cela. Int Comme pour Android, nous avons @IdRes dans l'annotation de support Android pour le cas susmentionné ?

1voto

Jaime Suarez Points 590

Vous ne pouvez pas faire la différence entre un Int provenant des ressources et un Int normal. Il s'agit de la même classe et vous ajoutez une extension à toutes les classes de type Int.

Une autre solution consisterait à créer votre propre enveloppe d'Int :

class IntResource(val resource: Int) {

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

Et ensuite, utilisez-le comme ceci :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X