Как отложить инициализацию представления модели с помощью Koin? - PullRequest
0 голосов
/ 13 сентября 2018

Я перехожу из кинжала в 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()
    }

}
...