Moxy. Android. MVP. Реализация в BasePresenter

Разбирался как устроен Moxy. И возникла некая проблема. Любой presenter наследуется от BasePresenter (также и с View, также имеется BaseView). В примере, MainPresenter наследуется от BasePresenter, поэтому наследоваться от MvpPresenter не получается (уже есть один super type). Остается вариант с BasePresenter, но там выдает ошибку (ошибка представлена ниже). Также происходит ошибка и со View. Как лучше поступить в данном случае. Избавиться от BasePresenter и BaseView? Но это придется код каждый раз копировать (не все было вставлено в эти классы, вставил только, что считал необходимым). Да, и в MainActivity имеется @InjectPresenter, но не в нем дело.

class MainActivity : BaseActivity<MainPresenter>(), MainView {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    if(savedInstanceState == null) {
        presenter.pushFragments(
            Const.TAG_ENTRANCE,
            EntranceApp(),
            supportFragmentManager
        )
    }
}

override fun instantiatePresenter(): MainPresenter {
    return MainPresenter(mainView = this)
} }

BaseActivity.kt

abstract class BaseActivity<Presenter> : BaseView, MvpAppCompatActivity() {

     protected val presenter: Presenter by lazy { instantiatePresenter() }

     protected abstract fun instantiatePresenter(): Presenter

     override fun getContext(): Activity = this }

MainPresenter.kt

class MainPresenter(mainView: MainView) : BasePresenter<MainView>(mainView) {}

BasePresenter.kt

@InjectViewState
abstract class BasePresenter<V : BaseView>(protected val view: V): MvpPresenter<V>() {
private val injector: PresenterInjector = DaggerPresenterInjector
    .builder()
    .baseView(view)
    .contextModule(ContextModule)
    .networkModule(NetworkModule)
    .databaseModule(DatabaseModule(view.getContext()))
    .build()

init {
    inject()
}

private fun inject() {
    when (this) {
        is SplashPresenter -> injector.inject(this)
    }
} }

MainView.kt и BaseView.kt

interface BaseView: MvpView {
    fun getContext(): Context
}

interface MainView: BaseView

Ошибка в BasePresenter

Moxy compilation failed; see the compiler error output for details (java.lang.IllegalArgumentException: View "" for com.viground.ui.base.BasePresenter cannot be found)

Ответы (1 шт):

Автор решения: Sergei Buvaka

Аннотация @InjectViewState позволяет сгенерировать для вашего Presenter-а объект ViewState. MvpPresenter создает экземпляр этого ViewState, и кладет его себе в качестве поля и будет везде использовать его. Вам же просто останется работать с методом public View getViewState() из MvpPresenter.

Из этого следует, что применять аннотацию можно только к конкретным классам Presenter-а. В вашем же случае вы пытаетесь применить ее к абстрактному классу.

→ Ссылка