У меня проблема. Я использую 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()
}