Pavel Arkhipov
04/27/2020, 2:50 PMUnable to instantiate activity ComponentInfo{uptop.me.testcoroutine/uptop.me.testcoroutine.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
Activity code:
class MainActivity : AppCompatActivity(), KodeinAware {
override val kodein by closestKodein(context = this)
private val viewModel: MainViewModel by kodein.instance<MainViewModelImpl>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel.doSomething()
}
}
Dependencies:
fun appModule(context: Context) = Kodein.Module("appModule") {
bind<MainInteractor>() with provider { MainInteractorImpl() }
bind<MainViewModel>() with provider { MainViewModelImpl(instance()) }
}
App:
class App: Application(), KodeinAware {
override val kodein: Kodein by Kodein.lazy {
import(androidXModule(this@App))
import(appModule(this@App))
}
}
Thanks in advance!romainbsl
04/28/2020, 6:02 AMoverride val kodein by closestKodein(context = this)
romainbsl
04/28/2020, 6:04 AMimport(appModule())
Pavel Arkhipov
04/28/2020, 6:19 AMoverride val kodein by closestKodein(context = this)
I writed that once because i tried different cases.
About context, i didn’t find any information that we need to provide any context into modules. And why if it doesn’t need? Maybe i have wrong information, tell me please if i am wrong.
My last code is:
class MainActivity : AppCompatActivity(), KodeinAware {
override val kodein: Kodein by closestKodein()
private val viewModel: MainViewModel by instance<MainViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel.doSomething()
}
}
And
fun appModule() = Kodein.Module("appModule") {
bind<MainInteractor>() with provider { MainInteractorImpl() }
bind<MainViewModel>() with provider { MainViewModelImpl(instance()) }
}
By the way, I tried to write
private val viewModel: MainViewModel by instance<MainViewModelImpl>()
but it doesn’t work. I thought, we can provide specific implementation into interface, but how i can see we can’t.
Thank you for your help!romainbsl
04/28/2020, 7:06 AMandroidXModule
you need to provide the context as we need it to resolve some android instances.romainbsl
04/28/2020, 7:06 AMromainbsl
04/28/2020, 7:06 AMprivate val viewModel: MainViewModel by instance()
romainbsl
04/28/2020, 7:07 AMprivate val viewModel by instance<MainViewModel>()
Pavel Arkhipov
04/28/2020, 7:14 AMprivate val somethingClass: SomethingClass by instance()
//////////////////////////
But this code
private val somethingClass by instance<SomethingClass>()
works okay.
Thank you for information.romainbsl
04/28/2020, 7:16 AMPavel Arkhipov
04/28/2020, 7:17 AMromainbsl
04/28/2020, 7:37 AMPavel Arkhipov
04/28/2020, 7:44 AMprivate val _parentKodein by closestKodein()
override val kodein by subKodein(_parentKodein) {
import(activityModule())
}
Or i can just import everything in kodein global and it’s enough?
I asked about that 😃romainbsl
04/28/2020, 7:45 AMromainbsl
04/28/2020, 7:45 AMromainbsl
04/28/2020, 7:46 AMromainbsl
04/28/2020, 7:46 AMPavel Arkhipov
04/28/2020, 8:06 AM