我正在玩 compose 并嘗試在 compose AndroidView 中包含一個片段。
所以在我的情況下,我們有一個帶有 ComposeView 的 AFragment,在 ComposeView 內部有一個 AndroidView,它創建一個 FragmentContainerView 并添加一個 PIFragment。
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View {
return ComposeView(requireContext()).apply {
setContent {
AppTheme {
GalleryScreen(
factory = viewModelFactory,
remoteConfig = remoteConfig,
id = id,
currentPosition = currentPositionState,
onBack = { router.back(requireActivity()) },
) {
AndroidView(
modifier = Modifier
.fillMaxWidth()
.wrapContentHeight(),
factory = {
FragmentContainerView(context).apply {
id = R.id.pFIC
}
},
update = {
childFragmentManager.beginTransaction().replace(
R.id.pFIC,
PIFragment::class.java,
buildArguments(
id = id,
origin = origin,
), null
).commitAllowingStateLoss()
},
)
}
}
}
}
}
一切正常,但是當我們在生產中發布此代碼時,我們看到 firebase 崩潰:
java.lang.IllegalArgumentException: No view found for id 0x7f0b072b (...:id/pFIC) for fragment PIFragment{ef1f89b} (bdbe15f0-679d-41bb-8a27-367655f73545 id=0x7f0b072b)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:513)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128)
at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:3065)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2988)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2180)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)
at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
uj5u.com熱心網友回復:
事實上,崩潰是在重新創建父片段之后發生的。
就我而言,由于導航:
- AFragment(帶 PIFragment)
- 導航到 BFragment
- 回到片段
崩潰,因為片段管理器正在嘗試重新創建 AFragment 和 PIFragment,但尚未完成組合傳遞,因此 pFIC 尚不存在。
解決方案是在父片段視圖被銷毀時洗掉 PIFragment。
override fun onDestroyView() {
childFragmentManager.findFragmentById(R.id.pFIC)?.let { fragment ->
childFragmentManager.beginTransaction().remove(fragment).commitAllowingStateLoss()
}
super.onDestroyView()
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/388718.html
