我根据google sample使用依赖注入。
我唯一可以传递的外部依赖项是通过AppComponent构建器
@Singleton
@Component(modules = {
AndroidInjectionModule.class,
AppModule.class,
MainTabActivityModule.class,
CoreActivityModule.class
})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
void inject(MyApplication myApplication);
}并像这样注入到应用程序中
@Override
public void onCreate() {
super.onCreate();
DaggerAppComponent
.builder()
.application(myApplication)
.build().inject(myApplication);
...
}根据文档,注入活动看起来像这样。我添加了我想要实现的目标。
public class YourActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
AndroidInjection
//.builder() THIS IS WHAT I WANT TO ACHIEVE
//.addActivityContext(this) THIS IS WHAT I WANT TO ACHIEVE
//.build() THIS IS WHAT I WANT TO ACHIEVE
.inject(this);
super.onCreate(savedInstanceState);
}
}但问题是如何向subComponent添加额外的参数。
@Subcomponent
public interface CoreActivitySubComponent extends AndroidInjector<CoreAppActivity> {
// @Subcomponent.Builder
// interface Builder {
// Builder addContext(Context context) //did not work
// CoreActivitySubComponent build(); //did not work
// }
//==or using abstract class
// in this option I do not know where to add parameter to this builder
@Subcomponent.Builder
public abstract class Builder extends AndroidInjector.Builder<CoreAppActivity> {
}
}发布于 2017-10-30 22:03:58
问题在于,Dagger 2.1.0方法AndroidInjection.inject(this);本应在活动和片段中使用,但没有提供任何构建器来添加外部依赖项。
我想创建依赖于活动/片段上下文的通用模块。
示例:
public class ToastController {
private Context context;
@Inject
public ToastController(Context context) {
this.context = context;
}
public void showToast(@StringRes int res) {
Toast.makeText(context, context.getText(res), Toast.LENGTH_SHORT).show();;
}
}但我不能将其推广到只能提供一个上下文模式的级别,相反,我必须为使用此模块的每个单独的活动/片段创建绑定模块。
@Singleton
@Component(modules = {
AndroidInjectionModule.class,
AppModule.class,
MainTabActivityModule.class,// IMPORTANT CLASS
})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
void inject(MyApplication myApplication);
}这是一个我为每个活动提供上下文模块的地方
@Module
public abstract class MainTabActivityModule
@ContributesAndroidInjector(modules = ContextMainTabActivityModule.class)//THIS MODULE
abstract MainTabActivity contributeMainActivity();
}上下文是使用@Binds注解提供的
@Module
public abstract class ContextMainTabActivityModule {
@Binds
abstract Context provideContext(MainTabActivity featureActivity);
}=====================
这可以通过根据sample重写方法seedInstance来完成
我试过了,但对我不起作用。
@Subcomponent.Builder
public abstract class Builder extends AndroidInjector.Builder<CoreAppActivity> {
abstract Builder addContextModule(ContextModule contextModule);
@Override
public void seedInstance(CoreAppActivity instance) {
addContextModule(new ContextModule(instance));
}
}下一节课
@Module
public class ContextModule {
private CoreAppActivity coreAppActivity;
@Provides
Context getContext() {
return coreAppActivity.getBaseContext();
}
public ContextModule(CoreAppActivity coreAppActivity) {
this.coreAppActivity = coreAppActivity;
}
}发布于 2017-10-31 18:41:42
您是否将ContextModule添加到您的@Subcomponent中,类似于this answer?我认为你的@Subcomponent应该是这样的:
@Subcomponent(module = {ContextModule.class})
interface MainTabActivityComponent extends AndroidInjector<CoreAppActivity> {
@Subcomponent.Builder
public abstract class Builder extends AndroidInjector.Builder<CoreAppActivity> {
abstract Builder addContextModule(ContextModule contextModule);
@Override
public void seedInstance(CoreAppActivity instance) {
addContextModule(new ContextModule(instance));
}
}
}最后,不要忘记在绑定模块中包含这个@Subcomponent。
最后一个问题:这真的是必需的吗?我发现在Application上使用AndroidInjector以及Activities和Fragments将在我注入它时为我提供正确的相应Context。
https://stackoverflow.com/questions/46994106
复制相似问题