如何使用Koin推迟初始化视图模型?

时间:2018-09-13 11:41:47

标签: android koin

我从匕首转到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()
    }

}

0 个答案:

没有答案