私は Koin を始めたばかりで (通常は Dagger を使用しています)、今のところ MVP を使用して View インスタンスを Presenter に渡すことができません。NullPointer 例外に行きました。ビューインスタンスをプレゼンターに渡す方法は? View で Koin が null を渡すように見えます (Dagger では、contributActivityInjection を使用します)
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)
}
}
}