我想在构建子组件构建器时为其设置一个值。如果只考虑简单的Dagger 2,我们可以实现以下目标:
@UserScope
@Subcomponent(modules = {UserModule.class, ActivityBuilder.class, NewEditQuotationModule.class})
public interface UserComponent {
NewEditQuotationComponent.Builder getNewEditQuotationComponent();
void inject(UserManager userManager);
@Subcomponent.Builder
interface Builder {
@BindsInstance
Builder user(User user);
UserComponent build();
}}
但是对于Dagger Android,子组件及其关联的构建器由@ContributesAndroidInjector处理。 Dagger自动生成子组件及其构建器,甚至是在当前上下文中的实现。
我想在构建My Dagger Android Subcomponent时设置一些值。我尝试了以下方法:
@Subcomponent(modules = NewEditQuotationModule.class)
public interface NewEditQuotationComponent extends AndroidInjector<InquiriesEditNewMainActivity> {
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<InquiriesEditNewMainActivity> {
@BindsInstance
public abstract Builder setName(@Named("My_Name") String name);
}}
@Module
public abstract class NewEditQuotationModule {
@Binds
@IntoMap
@ActivityKey(InquiriesEditNewMainActivity.class)
abstract AndroidInjector.Factory<? extends Activity>
bindInquiriesEditNewMainActivityInjectorFactory(NewEditQuotationComponent.Builder builder);
}
我厌倦了通过以下方式来构建它:
AndroidInjector.Builder androidInjector = MyApplication
.getApplication()
.getAppComponent()
.getApiEndPoint()
.getApiEndPointComponent()
.getUserManager()
.getUserComponent()
.getNewEditQuotationComponent().setName("My Name");
androidInjector.seedInstance(this);
androidInjector.build();
但没有成功。 请让我知道
答案 0 :(得分:1)
dagger.android
的工作方式是在onCreate
中自动创建您的组件,并且需要这种方式工作,因为允许Android自行创建您的Activity。预创建您的AndroidInjector将不起作用;那是您以前的方法的问题所在。
正如我试图通过重复问题投票所表明的那样,您在dagger.android中设置模块实例或@BindsInstance
值的唯一方法是通过overriding the seedInstance
method in the AndroidInjector.Builder
作为您的{{1} }。这样一来,您就可以将值从“活动”实例中拉出并在“活动”图中进行设置。
尽管您始终可以将数据存储在@Subcomponent.Builder
(ApplicationComponent作用域)对象或VM全局变量中,但是您正在尝试通过正确地将数据从Activity传递到Activity而不设置全局状态来做正确的事情。 我认为这是正确的方法,但您的解决方案可能不会涉及显式构造AndroidInjector 。而是使用pass your data through the extras bundle,这是一种将参数和其他数据传输到“活动”中的惯用方式;然后,您可以将数据从getIntent()
should be populated by the time onCreate(Bundle)
runs开始,从@Singleton
中的Activity实例上的getIntent().getExtras()
中拉出,插入到图形中。