Как я могу вводить объект в презентацию в андроид kotlin MVP mosby app с кинжалом

Я пытаюсь заставить кинжал работать в моем приложении. После создания Component Component и MyApp я могу использовать кинжал, чтобы внедрить службу базы данных, но у меня возникли проблемы с тем же делом с презентатором. Код:

class MyApp : Application() { var daoComponent: DaoComponent? = null private set override fun onCreate() { super.onCreate() daoComponent = DaggerDaoComponent.builder() .appModule(AppModule(this)) // This also corresponds to the name of your module: %component_name%Module .daoModule(DaoModule()) .build() } } 

модуль

 @Module class DaoModule { @Provides fun providesEstateService(): EstateService = EstateServiceImpl() } 

Компонент

 @Singleton @Component(modules = arrayOf(AppModule::class, DaoModule::class)) interface DaoComponent { fun inject(activity: MainActivity) } 

AppModule

 @Module class AppModule(internal var mApplication: Application) { @Provides @Singleton internal fun providesApplication(): Application { return mApplication } } 

Основная деятельность

 class MainActivity : MvpActivity<MainView, MainPresenter>(), MainView { @Inject lateinit var estateService : EstateService override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) (application as MyApp).daoComponent!!.inject(this)estateService.numberOfInvoicedEstates.toString() } override fun createPresenter(): MainPresenter = MainPresenterImpl() } 

После инъекции estateService таким образом я могу использовать его, но я не могу понять, как я могу использовать услугу непосредственно в презентаторе. Я пробовал делать это так, но он не работает. Должен ли я просто передавать введенные объекты из этой активности? или, может быть, я должен передать MyApp в качестве аргумента или сделать статический метод, позволяющий мне получить его из любого места в приложении?

 class MainPresenterImpl @Inject constructor(): MvpBasePresenter<MainView>(),MainPresenter { @Inject lateinit var estateService : EstateService } 

Ваш компонент должен предоставить докладчика следующим образом:

 @Component(modules = arrayOf(AppModule::class, DaoModule::class)) @Singleton interface MyComponent { mainPresenter() : MainPresenter } 

И все зависимости, которые необходимы для презентатора, вводятся ведущему через параметры конструктора:

 class MainPresenterImpl @Inject constructor(private val estateService : EstateService ) : MvpBasePresenter<MainView>(),MainPresenter { ... } 

Чем в createPresenter() просто хватайте презентатора от компонента кинжала следующим образом:

 class MainActivity : MvpActivity<MainView, MainPresenter>(), MainView { ... override fun createPresenter(): MainPresenter = (application as MyApp).myComponent().mainPresenter() } 

Обратите внимание, что код, показанный выше, не будет компилироваться. Это просто псевдокод, чтобы дать вам представление о том, как график зависимости может выглядеть в кинжале.

Пожалуйста, обратитесь к этому примеру о том, как использовать кинжал 2 в сочетании с MVP.

Вы должны сообщить своему компоненту, где хотите его ввести.

Итак, попробуйте с этим компонентом:

 @Singleton @Component(modules = arrayOf(AppModule::class, DaoModule::class)) interface DaoComponent { fun inject(presenter: MainPresenterImpl) }