У меня есть пример проекта, в котором я использую AndroidInjector dagger-android, чтобы ввести зависимости.
В этом примере приложения у меня есть класс Navigator
, который выполняет всю навигацию «Активность в активность» и требует наличия экземпляра текущего Activity
в своем конструкторе.
У меня есть класс AppModule
, который предоставляет экземпляры другому компоненту, который также отвечает за предоставление экземпляра Navigator
моему докладчику, но конструктор Navigator
принимает Activity
в качестве параметра из AppModule
.
Как я могу получить доступ к экземпляру действия к конструктору Navigator
.
Я пытался внедрить экземпляр Activity
непосредственно в Navigator
, аннотируя переменную-член Activity
аннотацией @Inject
, но это выдает ошибку при построении проекта.
ошибка: [dagger.android.AndroidInjector.inject (T)] android.app.Activity не может быть предоставлена без конструктора @Inject или метода, аннотированного @ Provides. android.app.Activity вводится в
Я сослался на другой пост SA, но это не помогло с моим запросом, или, может быть, я не понял решения, приведенного там.
Ниже приведен пост, за которым я следовал
Как добавить текущую активность в соавтор, используя Dagger 2.11 Android инжектор
Как получить MainActivity внутри модуля с помощью AndroidInjector
Ниже приведен код, который я реализовал:
Application.Java
public class MyApplication extends Application implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> androidInjector;
@Override
public void onCreate() {
super.onCreate();
DaggerAppComponent
.builder()
.application(this)
.build()
.inject(this);
}
@Override
public AndroidInjector<Activity> activityInjector() {
return androidInjector;
}
}
MainActivity.java
public class MainActivity extends BaseActivity implements BaseView {
@Inject
Context application;
@Inject
MainPresenter mainPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}
}
MyPresenter.Java
public class MyPresenter extends BasePresenter<IActivityView> {
private final NavigationRouter mNavigationRouter;
@Inject
public MyPresenter(Navigator navigatr) {
mNavigationRouter = navigationRouter;
}
}
Navigator.Java
//This is how my Navigator is currently.
public class Navigator{
Activity mActivity;
@Inject
public Navigator(Activity activity){
mActivity = activity;
}
}
ActivityBuilder.java
@Module
public abstract class ActivityBuilder {
@ContributesAndroidInjector
abstract MainActivity bindMainActivity();
@ContributesAndroidInjector
abstract LoginActivity bindLoginActivity();
}
AppModule.Java
@Module
public class AppModule {
//How can i have the instance of current activity in this module class.
@Provides
@Singleton
NavigationRouter providesNavigationRouter(Activity activity) {
//Here I want the instance of current activity
return new NavigationRouter(activity);
}
}
AppComponent.Java
@Component(modules = {
AndroidInjectionModule.class,
AppModule.class,
ActivityBuilder.class})
@Singleton
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
void inject(MyApplication application);
}
Любая помощь по этому вопросу будет высоко ценится.
Я обновил фрагмент кода для большей ясности