Я перехожу из кинжала в Koin, и в проекте у меня есть действие, которое вписывает свою модель представления в onCreate()
, потому что для этой модели представления требуется параметр, который передается в действие в Intent. Но и другие методы этой деятельности также используют эту модель представления (например, onPrepareOptionsMenu()
).
Итак, мое определение вида модели:
viewModel {(id: String) -> IdViewModel(id, get(), get())}
И моя проблемная активность:
class IdActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val id = intent.getStringExtra(ID_ENTRY_EXTRA)
//BTW can view model be init here?
val idViewModel: IdViewModel by viewModel { parametersOf(id) }
}
override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
//I need access to view model here but of course it cannot be pass as parameter
idViewModel.getFoo()
}
}
У меня есть идея, как ее решить: переместить идентификатор и просмотреть модель в параметре активности:
class IdActivity : BaseActivity() {
val id: String by lazy { intent.getStringExtra(ID_ENTRY_EXTRA)}
val idViewModel: IdViewModel by viewModel { parametersOf(id) }
override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
//now is a access:
idViewModel.getFoo()
}
}
Это правильный путь или есть лучший способ?
Edit:
Второе решение - получить ленивый вид модели:
class IdActivity : BaseActivity() {
lateinit var idViewModel: IdViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val id = intent.getStringExtra(ID_ENTRY_EXTRA)
idViewModel: IdViewModel = getViewModel { parametersOf(id) }
}
override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
//now is a access:
idViewModel.getFoo()
}
}