Android 带有Jetpack Compose的键盘被Compose beta-01破坏(在DecorView中未找到ViewTreeLifecycleOwner)

Android 带有Jetpack Compose的键盘被Compose beta-01破坏(在DecorView中未找到ViewTreeLifecycleOwner),android,android-jetpack-compose,Android,Android Jetpack Compose,如上所述,我能够用Jetpack Compose创建一个键盘现在,在我将项目从alpha-11升级到alpha-12之后,代码中断了(并且仍然在beta-01中中断),每当我尝试打开键盘时,都会出现以下错误: java.lang.IllegalStateException: ViewTreeLifecycleOwner not found from DecorView@aaf805f[InputMethod] at androidx.compose.ui.platform.Wi

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

 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
,并且在以前版本的compose中工作得非常好,直到
alpha-12

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


错误消息显示:

从中找不到ViewTreeLifecycleOwnerDecorView@aaf805f[输入方法]

Compose在整个
窗口的
DecorView
上查找
ViewTreeLifecycleOwner
集,而不是视图本身上的集

因此,与其在返回的
ComposeKeyboardView
上设置
ViewTree
s,不如使用的
InputMethodService
API with
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
}

错误消息显示:

从中找不到ViewTreeLifecycleOwnerDecorView@aaf805f[输入方法]

Compose在整个
窗口的
DecorView
上查找
ViewTreeLifecycleOwner
集,而不是视图本身上的集

因此,与其在返回的
ComposeKeyboardView
上设置
ViewTree
s,不如使用的
InputMethodService
API with
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
}

非常感谢你。我不明白为什么它以前能起作用。您忘记了链中的
窗口?
。我建议编辑这些更改深入到重新编译的发生方式,特别是在嵌套合成作用域的情况下(即,
ComposeView
,它膨胀
AndroidView
,然后膨胀
ComposeView
-嵌套但独立的作用域)现在这需要一个全局的生命周期概念,而窗口的
decorView
就是这个存储机制。这是相关的吗:?不知道,对不起。非常感谢。我不明白为什么它以前能起作用。您忘记了链中的
窗口?
。我建议编辑这些更改深入到重新编译的发生方式,特别是在嵌套合成作用域的情况下(即,
ComposeView
,它膨胀
AndroidView
,然后膨胀
ComposeView
-嵌套但独立的作用域)现在这需要一个全局的生命周期概念,而窗口的
decorView
就是这个存储机制。这是相关的吗?我不知道,对不起。