Как получить ссылку на ViewModel - PullRequest
0 голосов
/ 16 февраля 2020

У меня проблема. Я использую Navigation Framework и один из экранов вручную устанавливает дочерний фрагмент. В большинстве случаев есть портретная ориентация, но есть случай, когда он переходит в полноэкранный режим и разблокирует вращение. Когда вращение происходит, предыдущий фрагмент все еще существует и пытается выполнить свою функцию onDestroy (), которая приводит к cra sh, потому что ViewModel все еще не инициализирован.

Я думаю, что я поступил неправильно (очевидно).

Это приводит к значению cru sh (дочерний фрагмент, который непосредственно устанавливается родительским фрагментом):

private val vm: PlayCardsVm by lazy {
        (parentFragmentManager.findFragmentById(R.id.nav_host_fragment)
                as? PlayCardsFragment)?.vm ?: throw IllegalStateException()
    }

Ранее я пытался использовать parentFragment в качестве LifecycleOwner для получения ViewModel. Но это не сработало. Эта функция из родительского фрагмента, которая управляет дочерними фрагментами:

private fun onCardPage(cardPage: CardPage?) {
        if (cardPage != null) {
            parentFragmentManager.beginTransaction()
                .replace(R.id.card_container, CardFragment.getInstance(cardPage), "tag")
                .commit()
            placeholder.isVisible = false
        } else {
            parentFragmentManager.findFragmentByTag("tag")?.let {
                parentFragmentManager.beginTransaction()
                    .remove(it)
                    .commit()
            }
            placeholder.isVisible = true
        }
    }

Я подумал, что там нужно использовать childFragmentManager, но она также не работала, и вместо этого я использовал родительский. Но мне все еще нужен ViewModel, когда onDestroy произошел в дочернем фрагменте.

Пожалуйста, помогите мне.

Редактировать: В дочернем фрагменте:

override fun onDestroy() {
        super.onDestroy()
        vm.stopAudio()
    }

1 Ответ

0 голосов
/ 16 февраля 2020

Хорошо, так что вы не добавляете здесь нулевую проверку. Вы можете сделать это -

override fun onDestroy() {
        super.onDestroy()
        vm?.stopAudio()
    }

Просто добавьте нулевую проверку перед вызовом метода stopAudio (). Это позволит избежать вашего крэ sh.

...