>我有一个问题。我使用导航框架,其中一个屏幕手动设置子片段。大多数情况下是纵向的,但在某些情况下,它会进入全屏并解锁旋转。当旋转发生时,以前的片段仍然存在,并尝试执行其onDestroy((函数,这会导致崩溃,因为ViewModel仍未初始化。
我想我做错了(显然(。
这导致暗恋(由父片段直接设置的子片段(:
private val vm: PlayCardsVm by lazy {
(parentFragmentManager.findFragmentById(R.id.nav_host_fragment)
as? PlayCardsFragment)?.vm ?: throw IllegalStateException()
}
以前我尝试使用 parentFragment 作为生命周期所有者来获取 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
,但它也没有用,我转而使用父项。但是当子片段中发生onDestroy时,我仍然需要ViewModel。
请帮助我。
编辑:在子片段中:
override fun onDestroy() {
super.onDestroy()
vm.stopAudio()
}
好的,所以你没有在这里添加空检查。 你可以这样做 -
override fun onDestroy() {
super.onDestroy()
vm?.stopAudio()
}
只需在调用 stopAudio(( 方法之前添加一个空检查。它将避免您的崩溃。