1

我有一个 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;
    }
}
4

1 回答 1

2

目前,您已将交互器设置为要注入的字段。但是,没有注入该字段的机制,实际上没有必要这样做,因为您应该使用构造函数注入。

从您的演示者中删除以下内容:

@Inject lateinit var interactor: MainInteractor

而是将其注入构造函数中:

class MainPresenter @Inject constructor(private val interactor: MainInteractor)

目前 Dagger 也无法提供 aMainInteractor所以你需要注释它的构造函数:

class MainInteractor: BaseInteractor @Inject constructor () {

我不清楚和之间的区别MainPresenter是什么MainActivityPresenter,您可能还有其他问题。这些变化应该让你更接近。

于 2019-07-09T13:19:58.093 回答