Nieuwe Android Injector met Dagger 2 – deel 3

Als je deel 1 en deel 2 niet hebt gelezen, stel ik voor dat je die eerst leest. U vindt de links onderaan.

TLDR;

U kunt DaggerActivity, DaggerFragment, DaggerApplication gebruiken om boilerplate in uw Activity/Fragment/Application te verminderen.

Ook kunt u gebruik maken van AndroidInjector<T> in uw dagger componenten om boilerplate te verminderen ook.

Vergeet niet dat we AndroidInjection.inject() elke activiteit of fragment dat we wilden dagger te gebruiken aanroepen. En ook, Als u wilt Injection gebruiken in uw fragment, moet u ook implementeren HasSupportFragmentInject-interface en override fragment injector in uw activity.

Recently, verhuisde ik die code naar mijn basis activiteit en basis fragment. Waarom zou ik dat voor elke afzonderlijke activiteit moeten declareren? Ik denk dat het verplaatsen ervan naar de basisklasse acceptabel is.

Toen zag ik tijdens het onderzoek een aantal klassen in Dagger-project, DaggerAppCompatActivity en DaggerFragment. Deze klassen doen precies wat ik deed. Android houdt van overerving. Dus we kunnen doen alsof we daar ook van houden 😛

Laten we eens kijken wat er in deze bibliotheekklassen gebeurt.

DaggerAppCompatActivity

Niets anders eigenlijk. We kunnen de boilerplate-code in onze activiteit verminderen door onze activiteit uit te breiden van DaggerAppCompatActivity.

Onze DetailActivity-klasse was als volgt;

Laten we deze uitbreiden van DaggerAppCompatActivity en HasSupportFragmentInjector en de overrided-methode uit onze activiteit verwijderen.

Nu is het beter.

DaggerApplication, AndroidInjector, AndroidSupportInjectionModule

Laten we eens kijken wat we nog meer kunnen doen om boilerplate-code te verminderen. AndroidInjector helpt ons om onze App Component te vereenvoudigen. U kunt AndroidInjector documentatie van hier.

Laten we eens kijken naar onze app component en de toepassing klasse.

build() en seedInstance() is al gedefinieerd in AndroidInjector.Builder klasse. Dus we kunnen ons ontdoen van hen en onze Builder uitbreiden van AndroidInjection.Builder<Application>.

En ook, AndroidInjector interface heeft inject() methode in het. Dus we kunnen de inject() methode verwijderen en onze AppComponent interface uitbreiden van AndroidInjector<Application>

Dus, onze bijgewerkte en boilerplate-gereduceerde AppComponent interface zal er als volgt uitzien

Ben je je ervan bewust dat we onze modules ook hebben veranderd. Ik heb AndroidInjectionModule.class verwijderd uit de component modules en AndroidSupportInjectionModule.class toegevoegd. Deze is toegevoegd omdat we support Fragment hebben gebruikt. AndroidInjectionModule bindt je app.Fragment aan Dagger. Maar als je injectie wilt gebruiken in v4.fragment dan moet je AndroidSupportInjectionModule.class toevoegen aan je AppComponent modules.

We hebben de manier waarop we injecteren in onze AppComponent veranderd. Dus laten we eens kijken wat er is veranderd in onze Application klasse.

Net als in de DaggerActivity en DaggerFragment, moeten we ook onze Application klasse uit te breiden van DaggerApplication.

Onze Application class zag er als volgt uit;

We hebben het veranderd in..

Source

Je kunt deze vereenvoudigde implementatie als een branch vinden op mijn github pagina. Ik voeg dat niet samen in master omdat ik de oude school manier om dagger te gebruiken in elke branch wil laten zien. Dus lezers kunnen een weg volgen van de oude-school manier naar de vereenvoudigde manier.

PS.

Leave a Reply