0
votes

Est-il possible de faire une fonction globale générique pour plusieurs objets compagnons de Kotlin

Je développe une application à Kotlin qui a de nombreuses activités . La majeure partie de la navigation est simplement basique, en commençant la nouvelle activité, ne rien transmettre à l'intention. Pour quelques groupes d'activités, je pourrais passer des drapeaux, qui est également répétitif tout au long de mon projet (par exemple 5 activités qui définissent inent.flags = intent.flag_activity_clear_task ou inent.flag_activity_new_task ). Donc, si je pouvais trouver un moyen de faire valoir qu'une seule implémentation ferait des choses un peu plus agréables.

Pour faciliter la facilité et un petit nitre, j'ai créé des objets de compagnon pour les activités qui maintiennent le Fonction suivante: xxx

d'autres classes peut simplement appeler myactivit.startactivité (contexte) .

La fonction est assez basique et La seule différence entre la mise en œuvre dans différentes activités est évidemment le Myactivity :: Class.java -Part. Donc, j'aime savoir si c'est possible de déclarer cette fonction une seule fois et utilisez-la dans plusieurs objets compagnons pour les différentes activités.

Maintenant, je comprends que je pouvais faire quelque chose comme ça: < P> Je définis un objet qui a une fonction avec un type générique et la configurez-la comme ceci: xxx

mais cela semble toujours un peu hacky. Ce que je cherche, c'est quelque chose comme l'héritage ou une version implémentée d'une interface pour simplement ajouter à mon objet compagnon. Quelque chose comme: xxx

ou xxx

La première option serait particulièrement utile, car elle configurait automatiquement plusieurs fonctions de myObject pour myactivité . Est quelque chose comme ça même possible?


0 commentaires

3 Réponses :


1
votes

Vous n'avez même pas besoin d'un compagnon, juste une fonction d'extension.

inline fun <reified T: AppCompatActivity> Activity.startActivity(intentConfiguration: Intent.() -> Unit) {
    startActivity(Intent(this, T::class.java).apply(intentConfiguration))
}


2 commentaires

Vous n'avez pas besoin d'une instance d'une classe pour appeler une fonction d'extension dessus?


Je viens de remarquer que j'ai une fois même implémenté une fonction similaire à celle-ci, il suffit de passer la classe comme un paramètre normal de type kclass <*> et a donné l'extension au contexte au lieu de l'activité pour faire des vues capables de les appeler sans casser. Mais la Lambda est une belle addition ici. Bonne réponse!! La seule question qui reste maintenant est celle de celles-ci est une meilleure performance sage. Compagnon ou extension.



1
votes

Les objets de compagnon peuvent hériter d'autres classes. Il suffit de faire une implémentation de base quelque part: xxx

et héritez-y dans vos compagnons: xxx

C'est un peu verbeux mais c'est juste comment les génériques travail.


5 commentaires

C'est ce que je cherchais. Explication rapide Pourquoi j'ai choisi cette réponse sur (l'autre) [( Stackoverflow.com/a/63376412/4687402)], même si cela fait presque la même chose et les deux sont plutôt bons. Certaines activités nécessitent des valeurs passées à travers l'intention et la mise en œuvre que dans une fonction d'objet compagnon avec un paranéré supplémentaire et la masquage des balises est simplement plus propre. Ainsi, l'utilisation de cette approche rendrait l'ensemble du projet plus uniforme, dans la mesure où toutes les activités peuvent être appelées à partir d'une fonction statique startactivité avec tous les paramètres nécessaires.


En outre, Ajout rapide: la classe ne doit pas être abstraite, il peut simplement être ouvert .


Bien sûr, vous pouvez le faire ouvrir, mais s'il est fait spécifiquement hérité d'être hérité des objets de compagnon, quel est le but de l'instancier directement?


Bon point. Je viens d'y aller parce que c'est la "valeur par défaut" lors de l'utilisation de Java. Vous devez finaliser une classe là-bas pour obtenir ce qui est une classe par défaut à Kotlin. Mais oui, si ce n'est pas instancié directement, il n'y a aucune utilité pour cela.


J'ai posé une autre question, parce que je n'étais pas très satisfait de la façon dont cette solution a l'air. Bien que sa bonne solution, il y a un moyen facile de le rendre même nitre



0
votes

Voulez-vous simplement indiquer qu'une syntaxe plus concise serait de le faire avec une fonction d'extension de révision sur contexte code>. Et vous n'avez pas besoin de vous inquiéter des objets de compagnon non plus.

inline fun <reified T: Activity> Context.startActivity() = 
    startActivity(Intent(this, T::class.java))

//Usage:
someViewOrActivity.startActivity<MyActivity>()


0 commentaires