我有一个 VIPER 架构的应用程序。我将 DI 与 dagger-2 一起使用,但我无法将交互器注入演示者。
我得到下一个错误:
lateinit property interactor has not been initialized
我有下一个代码:
主视图 (Kotlin)
interface MainView {
interface View : BaseView {
showMessage(message : String)
}
interface InteractorOutput{
...
}
}
MainActivity (Kotlin)
class MainActivity : BaseActivity(), MainView.View {
@Inject lateinit var presenter: MainPresenter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
}
override fun onCreatePresenter() {
presenter.setView(this)
presenter.onCreate()
}
override fun initializeDagger() {
activityComponent.inject(this)
}
override fun showMessage(message : String){
Toast(...)
}
}
MainPresenter (Kotlin)
class MainPresenter @Inject constructor(): BasePresenter<MainView.View, MainInteractor>(), MainView.InteractorOutput {
@Inject lateinit var interactor : MainInteractor
override fun onCreate() {
interactor.doSomething()
}
}
主交互器 (Kotlin)
class MainInteractor: BaseInteractor() {
fun doSomething() {
Log.e("Hello ", "World!")
}
}
活动组件 (Java)
@PerActivity
@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class})
public interface ActivityComponent {
void inject(MainActivity mainActivity);
}
活动模块 (Java)
@Module
public class ActivityModule {
private final BaseActivity mActivity;
public ActivityModule(BaseActivity activity) {
mActivity = activity;
}
@Provides
@PerActivity
BaseActivity activity() {
return mActivity;
}
@Provides
@PerActivity
MainPresenter provideMainPresenter() {
return new MainPresenter();
}
}
应用程序组件 (Java)
@Singleton
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
void inject(BaseActivity baseActivity);
}
应用程序模块 (Java)
@Module
public class ApplicationModule {
private final BaseApplication mApplication;
public ApplicationModule(BaseApplication application) {
mApplication = application;
}
@Provides
@Singleton
Context provideApplicationContext() {
return mApplication;
}
}