2017-08-27 1 views
1

J'ai utilisé les nouvelles fonctions d'injection dagger.android et jusqu'à présent, je les ai vraiment appréciées.Est-il possible d'injecter un adaptateur Recycler View avec Dagger 2.11

Cependant, j'ai rencontré ce problème minuscule où il semble impossible d'injecter sur le terrain un adaptateur ou, fondamentalement, toute classe de non-activité que j'utilise.

Je sais que ce serait plus facile à @Inject le constructeur mais puisque je passe les données à mon recyclerview à travers le constructeur, ce n'est pas une option pour moi.

Cela signifie que je dois appeler le composant pour injecter ma classe.

Avec une classe AppComponent qui ressemble à ceci:

interface AppComponent : AndroidInjector<App> { 

    @Component.Builder 
    abstract class Builder { 
     abstract fun networkModule(networkModule: NetworkModule): Builder 
    } 

    fun inject(someClass SomeClass) 

} 

Le produit DaggerAppComponent ne reconnaît pas une méthode .inject() après avoir dit DaggerAppComponent.builder().build()

Je suis malentendu évidemment quelque chose Dagger parce que cela semble être le manière canonique d'injecter une classe.

Je suppose que c'est parce que je vais de AndroidInjector mais si c'est le cas, comment pourrais-je injecter une classe de non-activité. Parce que même si je faisais un @Subcomponent pour cette classe, il faudrait quand même l'appeler de DaggerAppComponent

+0

La façon dont j'ai fini par contourner ce problème était la lecture de cet article https: // blog. davidmedenjak.com/android/2017/11/11/dagger-rules-engagement.html et abandonnant l'hypothèse que je ne pouvais pas construire ou injecter l'adaptateur. Bien sûr, je pouvais mais - comme l'article l'a dit - je copiais et collais du code dont je ne connaissais pas la fonction. Après avoir ajouté une variable publique à l'adaptateur qui contenait les éléments, je pouvais arrêter de les passer à travers le constructeur et ensuite injecter les dépendances nécessaires sans aucun problème. Cependant, cela implique également d'injecter l'adaptateur dans le modèle de vue. – nmu

Répondre

0

C'est une question de goût (et de conception de code plus impeccable), mais je ne pense pas que vous le fassiez La bonne façon. Que voulez-vous dire par "puisque je passe les données à mon recyclerview à travers le constructeur"? Vous affectez des données à l'adaptateur, pas le recyclerview lui-même.

Si vous ne voulez pas (mais devrait probablement) utiliser l'approche MVP, objectif des données de chargement de quelque part et puis l'afficher avec RCV ressemblerait à quelque chose comme ceci:

class TestFragment : Fragment() { 

    val recyclerView: RecyclerView by bind(R.id.recyclerview) // Custom view binding but whatever 
    val adapter: TestAdapter? = null 

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { 
     val view = inflater!!.inflate(R.layout.test, container, false) 

     // Initialize 
     recyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false) 
     adapter = TestAdapter(mutableListOf()) 
     recyclerView.adapter = adapter 

     // Add data 
     adapter.addItem(MyClass("Hey it's working")) 

     return view 
    } 
} 

Comme pour le poignard androïde, Je ne le trouve pas plus utile que le poignard ordinaire. Cela rend les choses encore plus compliquées.

Je conseille fortement d'utiliser MVP pour android. Voici un de mes exemples, qui élimine tout besoin d'une activité/composant pour injecter des dépendances du tout, n'hésitez pas à jeter un oeil MVP sample

+0

Oui, je voulais dire passer les données au constructeur de mon adaptateur, tout comme vous l'êtes. 'class Adapter (private val data: Liste ): RecyclerView.Adapter {// ...}' Donc je ne peux pas '@ Inject' parce que je n'injecte pas la' List '. Et ouais j'utilise MVVM, donc c'est la raison pour laquelle je veux injecter mes dépendances. – nmu

+2

ce n'est pas une réponse à la question –