Я новичок в кинжале и с трудом понимаю, как передать контекст приложения в модуль, а затем в другие классы. У меня есть опыт работы с Guice, но не с Dagger. Я знаю, что об этом уже было много постов, но я не могу понять, что мне нужно сделать, чтобы запустить его.
Мой код ниже:
Компонент:
@Component(
modules = {
AndroidSupportInjectionModule.class,
ActivityBuildersModule.class,
AppModule.class
})
public interface AppComponent extends AndroidInjector<ManatimeApplication> {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
}
Приложение:
public class ManatimeApplication extends DaggerApplication {
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
Log.d("DAGGER", "ManatimeApplication hash: " + hashCode());
return DaggerAppComponent.builder().application(this).build();
}
}
Модули:
ActivityBuildersModule:
@Module
public abstract class ActivityBuildersModule {
@ContributesAndroidInjector
abstract MainActivity contributeMainActivity();
}
AppModule:
public class AppModule {
private Application context;
public AppModule(Application context) {
this.context = context;
}
@Provides
static String test() {
return "dagger test";
}
@Provides
Context provideAppContext() {
Log.d("DAGGER", "ManatimeApplication in AppModule hash: " + context.hashCode());
return context;
}
}
Компиляция этого кода не получается с сообщением:
> Task :app:compileDebugJavaWithJavac FAILED
/Users/sunnykumar/AndroidStudioProjects/MyApplication/app/src/main/java/com/manatime/ManatimeApplication.java:6: error: cannot find symbol
import com.manatime.di.DaggerAppComponent;
^
symbol: class DaggerAppComponent
location: package com.manatime.di
/Users/sunnykumar/AndroidStudioProjects/MyApplication/app/src/main/java/com/manatime/di/AppComponent.java:22: error: @Component.Builder is missing setters for required modules or components: [com.manatime.di.AppModule]
interface Builder {
^
2 errors
Вопросы:
1) Придется ли мне создавать AppModule с getApplicationContext()
в ManatimeApplication
и устанавливать его в компоновщике?
2 ) Есть ли другой способ решить эту проблему?
3) Что делает @BindsInstance
, если оно не связывает значение приложения, которое я установил в компоновщике?
4) Сходятся ли значения, установленные в Компоненте компоновщика к модулю приложения?