Nuovo iniettore Android con Dagger 2 – parte 3

Se non avete letto la parte 1 e la parte 2, vi consiglio di leggerle prima. Puoi trovare i link in basso.

TLDR;

Puoi usare DaggerActivity, DaggerFragment, DaggerApplication per ridurre il boilerplate nella tua Activity/Fragment/Application.

Anche tu puoi usare AndroidInjector<T> nei tuoi componenti Dagger per ridurre anche il boilerplate.

Ricorda che chiamiamo AndroidInjection.inject() ogni attività o frammento che vogliamo usare Dagger. E inoltre, se vuoi usare Injection nel tuo frammento, dovresti anche implementare l’interfaccia HasSupportFragmentInject e sovrascrivere l’iniettore del frammento nella tua attività.

Di recente, ho spostato quel codice nella mia attività di base e frammento di base. Perché dovrei avere bisogno di dichiararlo per ogni singola attività? Penso che spostarli nella classe base sia accettabile.

Poi vedo alcune classi nel progetto dagger durante la ricerca, DaggerAppCompatActivity e DaggerFragment. Queste classi fanno esattamente quello che ho fatto. Android ama l’ereditarietà. Quindi possiamo far finta di amarla anche noi 😛

Vediamo cosa succede dentro queste classi di libreria.

DaggerAppCompatActivity

Nulla di diverso in realtà. Possiamo ridurre il codice boilerplate nella nostra attività estendendo la nostra attività da DaggerAppCompatActivity.

La nostra classe DetailActivity era come la seguente;

Estendiamola da DaggerAppCompatActivity e rimuoviamo HasSupportFragmentInjector e il metodo overrided dalla nostra attività.

Ora è meglio.

DaggerApplication, AndroidInjector, AndroidSupportInjectionModule

Vediamo cos’altro possiamo fare per ridurre il codice boilerplate. AndroidInjector ci aiuta a semplificare il nostro App Component. Puoi controllare la documentazione di AndroidInjector da qui.

Vediamo il nostro componente app e la classe dell’applicazione.

build() e seedInstance() sono già definiti nella classe AndroidInjector.Builder. Quindi possiamo liberarcene ed estendere il nostro Builder da AndroidInjection.Builder<Application>.

E inoltre, l’interfaccia AndroidInjector ha il metodo inject(). Quindi possiamo rimuovere il metodo inject() ed estendere la nostra interfaccia AppComponent da AndroidInjector<Application>

Così, la nostra interfaccia AppComponent aggiornata e ridotta a boilerplate sarà come segue

Ti sei accorto che abbiamo cambiato anche i nostri moduli. Ho rimosso AndroidInjectionModule.class nei moduli dei componenti e ho aggiunto AndroidSupportInjectionModule.class. Questo viene aggiunto perché abbiamo usato il supporto Fragment. AndroidInjectionModule lega il tuo app.Fragment a dagger. Ma se vuoi usare l’iniezione in v4.fragment allora dovresti aggiungere AndroidSupportInjectionModule.class ai tuoi moduli AppComponent.

Abbiamo cambiato il modo di iniettare nel nostro AppComponent. Quindi vediamo cosa è cambiato nella nostra classe Application.

Proprio come in DaggerActivity e DaggerFragment, dobbiamo anche estendere la nostra classe Application da DaggerApplication.

La nostra classe Application era simile alla seguente;

L’abbiamo cambiata in..

Source

Si può trovare questa implementazione semplificata come ramo nella mia pagina github. Non lo sto fondendo in master perché voglio mostrare il modo vecchio di usare dagger in ogni ramo. Così i lettori possono seguire una strada dal modo vecchia scuola al modo semplificato.

PS.

Leave a Reply