Mon objectif:Dagger2 sous-composante confusion dans Android
Pour comprendre comment fonctionne la portée et la façon de mettre en œuvre un UserScope
que je peux utiliser sur plusieurs activités et réinitialiser/créer un nouveau si nécessaire.
Méthodes J'utilise:
Ce Blog: http://frogermcs.github.io/building-userscope-with-dagger2/
Il explique apparemment la même chose que je suis en train de réaliser ici.Docs officiels http://frogermcs.github.io/building-userscope-with-dagger2/
bref rapide sur le blog
De toute évidence, il est UserModule
et UserComponent
. Auteur a enveloppé la création de UserComponent
sous UserManager
qui a ApplicationScope
. Donc UserManager
est disponible au moment de la connexion. Lorsque la connexion est réussie UserComponent
est initialisé via UserManager
. Logique simple
Maintenant, ce @UserScope
déjà initialisé est utilisé dans deux activités, comme vous pouvez le voir dans l'image.
Ce que je me bats pour comprendre
Jetez un oeil à UserComponent
.
public interface UserComponent {
@Subcomponent.Builder
interface Builder {
Builder sessionModule(UserModule userModule);
UserComponent build();
}
UserDetailsActivityComponent plus(UserDetailsActivityComponent.UserDetailsActivityModule module);
RepositoriesListActivityComponent plus(RepositoriesListActivityComponent.RepositoriesListActivityModule module);
LogoutManager logoutManager();
}
Plus précisément UserDetailsActivityComponent
et RepositoriesListActivityComponent
sont créés par UserComponent
. Comme cela,
@Override
protected void onUserComponentSetup(UserComponent userComponent) {
userComponent.plus(new UserDetailsActivityComponent.UserDetailsActivityModule(this)).inject(this);
}
Alors ils ont d'abord obtenir une pré-créée en UserComponent
par UserManager
puis il appelle onUserComponentSetup
qui crée alors le composant approprié et injecte l'activité en cours.
Je ne comprendre avec ce modèle mentionné ci-dessus, comme je l'ai lu dans les documents que nous utilisons plus(InjectionToBeDoneOn i)
quand nous avons besoin de l'injection sur un cas particulier de InjectionToBeDoneOn
. Mais pourquoi injecter cette activité via ce composant? Qu'est-ce que cela accomplit? Est-ce que cela n'aurait pas de sens de faire cela de manière conventionnelle en onCreate()
de l'activité avec DaggerXYZComponent().Builder().Build().inject(activity)
?
En outre, il me manque un matériau décent de la façon dont UserScope
est mis en œuvre dans Android qui a une durée de vie de connexion à déconnexion, mais pas plus grande que la portée @Singleton
.
Cela a du sens. Je vous remercie. mais 'UserModule' n'a pas d'attribut' subcomponents' pour 'UserDetailsActivityComponent', comme mentionné dans les Docs, mais toujours' UserDetailsActivityComponent' peut servir de sous-composant de 'UserComponent'? – Ankit
@Ankit Je ne comprends pas très bien de quoi vous parlez. Pourriez-vous élaborer votre question? –
cela provient du document 'Pour ajouter un sous-composant à un composant parent, ajoutez la classe de sous-composant à l'attribut sous-composants d'un @Module que le composant parent installe. Ensuite, le constructeur du sous-composant peut être demandé à partir du parent. »C.-à-d.' @Module (sous-composants = RequestComponent.class) ' – Ankit