Обеспечить активность в Koin MVP

#android #koin

#Android #koin

Вопрос:

Я новичок в Koin (обычно я использую Dagger), и на данный момент я не могу передать свой экземпляр View презентатору с помощью MVP. У меня есть исключение NullPointer. Как передать экземпляр представления моему докладчику? Похоже, что Koin передает null при просмотре (в Dagger я буду использовать contributeActivityInjection

 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
        at android.support.v7.app.AppCompatDelegateImpl.<init>(AppCompatDelegateImpl.java:249)
        at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:182)
        at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:520)
        at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:191)
        at com.strangelove.dtfu.MainActivity._$_findCachedViewById(Unknown Source:25)
        at com.strangelove.dtfu.MainActivity.showText(MainActivity.kt:10)
        at com.strangelove.dtfu.MySimplePresenter.sayHelloFromActivity(MySimplePresenter.kt:7)
        at com.strangelove.dtfu.MainActivity.onCreate(MainActivity.kt:19)
  

Ведущий

 class MySimplePresenter(private val repo: HelloRepository, private val mainActivityView: MainActivityView) {
    fun sayHello() = "${repo.giveHello()} from $this"

    fun sayHelloFromActivity() {
        mainActivityView.showText(sayHello())
    }
}
  

Активность

 class MainActivity : AppCompatActivity(), MainActivityView {
    override fun showText(text: String) {
        first_textView.text = firstPresenter.sayHello()
    }

    private val firstPresenter: MySimplePresenter by inject()

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

    override fun onStart() {
        super.onStart()
        firstPresenter.sayHelloFromActivity()
    }
}
  

Вид

 interface MainActivityView {
    fun showText(text: String)
}
  

модули

 val appModule = module {
    single<HelloRepository> {
        HelloRepositoryImpl()
    }

    factory {
        MySimplePresenter(get(), get())
    }
}

val activityModule = module {
    single<MainActivityView> {
        MainActivity()
    }
}
  

Приложение:

 class MyApplication: Application() {
    override fun onCreate() {
        super.onCreate()
        startKoin {
            androidLogger()
            androidContext(this@MyApplication)
            modules(appModule, activityModule)
        }
    }
}
  

Комментарии:

1. Никогда не создавайте экземпляр действия самостоятельно вручную

Ответ №1:

Попробуйте изменить

 factory {
    MySimplePresenter(get(), get())
}
  

Для

 factory { (view: MainActivityView) ->
    MySimplePresenter(get(), view)
}
  

И в активности:

 private val firstPresenter: MySimplePresenter by inject { parametersOf(this@MainActivity) }
  

Этим вы предоставляете представление в качестве аргумента, что, я считаю, желательно в этой ситуации.