我从匕首转到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()
}
}
我知道如何解决:将id并查看模型移至活动参数:
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()
}
}
是正确的方法还是更好的方法?
编辑:
第二个解决方案是以一种不懒惰的方式获取视图模型:
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()
}
}