【问题标题】:Keyboard with Jetpack Compose was broken by Compose beta-01 (ViewTreeLifecycleOwner not found from DecorView)Compose beta-01 损坏了带有 Jetpack Compose 的键盘(在 DecorView 中找不到 ViewTreeLifecycleOwner)
【发布时间】:2021-06-01 09:22:04
【问题描述】:

This is related to this question

正如here 所述,我能够使用 Jetpack Compose 创建一个键盘。 现在,在我将项目从 alpha-11 升级到 alpha-12 后,代码损坏了(并且在 beta-01 中仍然损坏)并且每当我尝试打开键盘时都会收到以下错误: p>

 java.lang.IllegalStateException: ViewTreeLifecycleOwner not found from DecorView@aaf805f[InputMethod]
        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:176)
        at androidx.compose.ui.platform.AbstractComposeView.onAttachedToWindow(ComposeView.android.kt:207)
        at android.view.View.dispatchAttachedToWindow(View.java:20105)
        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3430)
        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
        at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2052)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1745)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7768)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:967)
        at android.view.Choreographer.doCallbacks(Choreographer.java:791)
        at android.view.Choreographer.doFrame(Choreographer.java:726)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:952)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:491)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:940)

这很奇怪,因为我已经设置了 ViewTreeLifecycleOwner here 并且在之前版本的 compose 中工作得非常好,直到 alpha-12

这个错误让我不知道什么是坏的,我应该改变什么。也许你能帮帮我。

Here you can find all code for a reproducible example

【问题讨论】:

标签: android android-jetpack-compose


【解决方案1】:

错误信息说:

在 DecorView@aaf805f[InputMethod] 中找不到 ViewTreeLifecycleOwner

Compose 在整个WindowDecorView 上查找ViewTreeLifecycleOwner 集,而不是视图本身上的集。

因此,不要在返回的ComposeKeyboardView 上设置ViewTrees,而是使用getWindow()InputMethodService API 和getDecorView() 来获取窗口的DecorView。

override fun onCreateInputView(): View {
    val view = ComposeKeyboardView(this)
    window?.window?.decorView?.let { decorView ->
        ViewTreeLifecycleOwner.set(decorView, this)
        ViewTreeViewModelStoreOwner.set(decorView, this)
        ViewTreeSavedStateRegistryOwner.set(decorView, this)
    }
    return view
}

【讨论】:

  • 非常感谢。我不明白为什么它以前有效。您在链中忘记了window?。我建议修改
  • 这些变化在重新组合的发生方式上很深,特别是在你有嵌套组合范围的情况下(即,一个 ComposeView 膨胀一个 AndroidView 然后膨胀一个 ComposeView - 嵌套,但是单独的作用域)现在需要一个全局的生命周期概念,而 Window 的 decorView 就是这种存储机制。
  • 现在动画坏了。是否相关:stackoverflow.com/questions/66448080/…
  • 不知道那个,抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
相关资源
最近更新 更多