You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
It's a bug. Adding a scoping annotations (e.g. making JudgmentalCoffee a @Singleton in the example above) changes what gets injected. For a big projects and long injection chains this may lead to a very surprising results.
The text was updated successfully, but these errors were encountered:
This particular case is actually working as intended.
Note that the feature only works for bindings that depend on optional bindings and/or multibindings. In particular, Dagger will re-resolve a binding in a component if there is a contribution to the optional binding or multibinding in that component.
For example, with multibindings you can have something like this:
@ModuleinterfaceParentModule {
@MultibindsSet<Bar> setOfBar();
@ProvidesFooprovideFoo(Set<Bar> setOfBar) { ... }
}
@ModuleinterfaceChildModule {
@Provides@IntoSetBarprovideBarIntoSet() { ... }
}
publicvoidmain() {
// The set is empty in this FooFooparentFoo = parentComponent.getFoo();
// The set has one element in this FooFoochildFoo = childComponent.getFoo();
}
I do agree that the behavior is a bit confusing since the contents of the optional or multibinding can change depending on which component you request it from, but that's how they were designed and also their main benefit.
Also note that #2085 is different and that actually is a bug. In that case the issue was that we were re-resolving for non-optional/multibindings.
It's a bug. Adding a scoping annotations (e.g. making JudgmentalCoffee a @Singleton in the example above) changes what gets injected. For a big projects and long injection chains this may lead to a very surprising results
Sorry, forgot to comment on this in my previous post.
Yes, scoping JudgmentalCoffee with @Singleton means that it will be locked into the ParentComponent and so it would no longer pick of the Sugar you've provided in your ChildComponent (i.e. the Optional<Sugar> it injects will be empty).
This complexity is part of the trade-off of using optional/multibindings, and I would advise to use them as little as possible and only when absolutely needed.
Like #2085, but for optional bindings.
It's possible for a child component to satisfy an optional binding, so that it will be injected into a parent component's class.
Example: https://gist.github.com/goj/defb14a6232064a0a4beb7d77913e8c3
Is it a bug or a feature?
It's a bug. Adding a scoping annotations (e.g. making
JudgmentalCoffee
a@Singleton
in the example above) changes what gets injected. For a big projects and long injection chains this may lead to a very surprising results.The text was updated successfully, but these errors were encountered: