Как стать MVP в Dagger Hilt?

Я не могу скомпилировать код с использованием подхода Model View Presenter (MVP) Hilt.

Я получаю эту ошибку: /MotionPoC/app/build/generated/source/kapt/debug/com/aria/motionpoc/di/MotionApp_HiltComponents.java:145: error: [Dagger / MissingBinding] com.aria.motionpoc. coupon.MainActivity не может быть предоставлен без конструктора @Inject или метода с аннотацией @ Provides. Этот тип поддерживает внедрение членов, но не может быть предоставлен неявно.

Сам код:

MainActivity.kt

@AndroidEntryPoint
class MainActivity : AppCompatActivity(), MainContract.View {

    @Inject
    lateinit var presenter: MainContract.Presenter

MainPresenter.kt

class MainPresenter @Inject constructor(
    private val view: MainContract.View
): MainContract.Presenter {

    override fun onViewCreated() {
        view.showList()
    }
}

MainModule.kt

@InstallIn(ActivityComponent::class)
@Module
abstract class MainModule {

    @Binds
    abstract fun bindActivity(view: MainActivity): MainContract.View

    @Binds
    abstract fun bindPresenter(impl: MainPresenter): MainContract.Presenter
}

MotionApp.kt

@HiltAndroidApp
open class MotionApp : Application()

Решено! Спасибо за помощь, Мануэль Виво! https://github.com/riodext/AndroidDaggerHiltMVP


person Arià    schedule 07.08.2020    source источник
comment
Вам не хватает @AndroidEntryPoint на вашем MainActivity, и у вас есть зависимость Circle, которая не компилируется. Для действия нужен докладчик, а для ведущего необходимо, чтобы действие было инициализировано.   -  person Javier Antón    schedule 09.08.2020
comment
У меня уже был @AndroidEntryPoint (забыл поставить сюда). А что касается зависимости Cicle, как бы вы реализовали MVP? Спасибо за ответы!   -  person Arià    schedule 09.08.2020
comment
Я имею в виду, как я могу вызывать методы из представления в моем презентаторе? Разделение Activity и Presenter друг от друга.   -  person Arià    schedule 09.08.2020
comment
Я бы установил View в презентаторе на onCreate, а в onDestroy я бы установил для него значение null. Что-то вроде переопределения onCreate (blabla) {super.onCreate (blala) presenter.setView (this)}   -  person Javier Antón    schedule 11.08.2020
comment
Я хотел сделать инъекцию через конструктор, а не вручную. Решено на: github.com/riodext/AndroidDaggerHiltMVP   -  person Arià    schedule 17.08.2020


Ответы (1)


Проблема в том, что вы зависите от конкретной реализации Activity, и эта зависимость (т.е. MainActivity) не удовлетворяется в коде.

Вам нужно будет предоставить это как привязку в том же модуле:

@InstallIn(ActivityComponent::class)
@Module
object MainActivityModule {

    @Provides
    fun bindActivity(activity: Activity): MainActivity {
        return activity as MainActivity
    }
}
person manuelvicnt    schedule 12.08.2020
comment
Спасибо за ответы! Я пробовал это, но получил эту ошибку в bindActivity: /di/MainModule.java:21: error: тип параметра методов @Binds должен быть назначен типу возвращаемого значения - person Arià; 12.08.2020
comment
Это потому, что ваша деятельность другого типа? Попробуйте AppCompatActivity - person manuelvicnt; 12.08.2020
comment
Я загрузил проект в: github.com/riodext/AndroidDaggerHiltMVP - person Arià; 12.08.2020
comment
Решено! Если кто-то хочет увидеть решение по ссылке выше - person Arià; 17.08.2020
comment
Сработало хорошо! Спасибо. - person funct7; 02.12.2020