将 Jetpack Compose 库更新为 beta01
后,我无法显示 DialogFragment 或 BottomSheetDialogFragment。
看起来 ViewTreeLifecycleOwner
在我的活动中找不到了。此外,我尝试了几种可能的 solutions,但都没有成功。
片段中的视图膨胀为:
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(
R.layout.fragment_full_screen_layout, container, false
).apply {
findViewById<ComposeView>(R.id.compose_view).setContent {...}
和对话片段显示为:
DialogFragmentExample.newInstance().show(supportFragmentManager, null)
有人遇到过类似的问题吗?拜托,欢迎提出任何建议。
堆栈跟踪:
java.lang.IllegalStateException: ViewTreeLifecycleOwner not found from DecorView@409dd5d[MainActivity]
at androidx.compose.ui.platform.WindowRecomposer_androidKt.createLifecycleAwareViewTreeRecomposer(WindowRecomposer.android.kt:214)
at androidx.compose.ui.platform.WindowRecomposer_androidKt.access$createLifecycleAwareViewTreeRecomposer(WindowRecomposer.android.kt:1)
at androidx.compose.ui.platform.WindowRecomposerFactory$Companion$LifecycleAware$1.createRecomposer(WindowRecomposer.android.kt:98)
at androidx.compose.ui.platform.WindowRecomposerPolicy.createAndInstallWindowRecomposer$ui_release(WindowRecomposer.android.kt:151)
at androidx.compose.ui.platform.WindowRecomposer_androidKt.getWindowRecomposer(WindowRecomposer.android.kt:199)
at androidx.compose.ui.platform.AbstractComposeView.ensureCompositionCreated(ComposeView.android.kt:177)
at androidx.compose.ui.platform.AbstractComposeView.onAttachedToWindow(ComposeView.android.kt:222)
答案 0 :(得分:4)
我什至没有使用 DialogFragment
也遇到了同样的异常。
我的解决方法是设置 ViewTreeLifecycleOwner
中的 Activity
:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ViewTreeLifecycleOwner.set(window.decorView, this)
// setContent(...); add fragment using Compose view
}
}
我目前正在使用以下库:
androidx.activity:activity-ktx:1.3.0-alpha04
androidx.fragment:fragment-ktx:1.3.1
androidx.compose.*:*:1.0.0-beta02
答案 1 :(得分:2)
根据Fragment 1.3.1 release notes:
<块引用>def add_depth(hash, depth = 0)
hash
.transform_values { |v| v.is_a?(Hash) ? add_depth(v, depth + 1) : v }
.merge(depth: depth)
end
中的对话框现在可以通过其 DecorView 访问 ViewTree 所有者,确保 DialogFragment
可以与 DialogFragment
一起使用。 (Ib9290, b/180691023)
所以你应该确保升级到 Fragment 1.3.1:
ComposeView