我是Dagger 2的新手,我试图为课程提供Activity Context,但没有成功。我搜索了很多,但是没有找到合适的答案。
我可以提供应用程序上下文。但是我也需要提供活动上下文,我不知道实现它的任何好方法。
我需要澄清一下,我将Dagger用于Android依赖项。
def dagger_version = "2.24"
implementation "com.google.dagger:dagger:$dagger_version"
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
implementation "com.google.dagger:dagger-android:$dagger_version"
implementation "com.google.dagger:dagger-android-support:$dagger_version"
annotationProcessor "com.google.dagger:dagger-android-processor:$dagger_version"
我也只有一个具有以下代码的AppComponent:
@Singleton
@Component(
modules = {
AndroidSupportInjectionModule.class,
ActivityBuildersModule.class,
AppModule.class,
ViewModelFactoryModule.class,
}
)
public interface AppComponent extends AndroidInjector<BaseApplication> {
SessionManager sessionManager();
@Component.Builder
interface Builder{
@BindsInstance
Builder application(Application application);
AppComponent build();
}
}
除了我的每个活动都有一个模块,但是我没有找到为AppComponent或从ActivityModule注入活动上下文的方法。
正确的方法是什么?
@Module
class MainActivityModule(mActivity: MainActivity) {
var mActivity: MainActivity
init {
this.mActivity= mActivity
}
@Singleton
@Provides
fun getMainActivity(): MainActivity{
return mActivity
}
}
现在将此模块添加到您的Component类中,并在使用组件构建器时将您的活动传递给模块构造函数,希望对您有所帮助。
@@ Named注释有助于我们区分上下文。通过添加如下所示的@Named批注,我们可以区分ActivityModule和ContextModule中的方法context():
@Module
public class ActivityModule {
private final Context context;
ActivityModule(Activity context){
this.context = context;
}
@Named("activity_context")
@Provides
public Context context(){ return context; }
}
@Module
public class ContextModule {
private final Context context;
ActivityModule(Activity context){
this.context = context;
}
@Named("application_context")
@Provides
public Context context(){ return context.getApplicationContext(); }
然后,我们告诉Dagger使用各自的上下文,如下所示:
@Module(includes = ContextModule.class)
public class OkHttpClientModule {
....
@Provides
public File file(@Named("application_context") Context context){
File file = new File(context.getCacheDir(), "HttpCache");
file.mkdirs();
return file;
}
....
}
希望这会有所帮助。
您可以使用Activity
或Application
,以与当前绑定@Component.Builder
实例相同的方式绑定@Component.Builder
实例。
示例实现看起来像这样:
@Component.Factory
@Component.Factory
@Subcomponent(...)
interface ActivitySubcomponent {
@Subcomponent.Factory
interface Factory {
ActivitySubcomponent create(@BindsInstance MyActivity activity)
}
}