#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) }
Этим вы предоставляете представление в качестве аргумента, что, я считаю, желательно в этой ситуации.