从 DecorView@2da7146[MyActivity] 中找不到 ViewTreeLifecycleOwner

问题描述

从撰写 alpha-11 更新到 alpha-12(或 beta-01)后,每当我打开具有撰写视图的活动或片段时,都会遇到此崩溃。

我正在使用实现 AppCompatActivityLifecycleOwner,所以这非常奇怪。

    java.lang.IllegalStateException: ViewTreeLifecycleOwner not found from DecorView@2da7146[MyActivity]
            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:20014)
            at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3589)
            at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3596)
            at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3596)
            at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3596)
            at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3596)
            at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3596)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2223)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1888)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8511)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
            at android.view.Choreographer.doCallbacks(Choreographer.java:761)
            at android.view.Choreographer.doFrame(Choreographer.java:696)
            at android.view.Choreographer$FramedisplayEventReceiver.run(Choreographer.java:935)
            at android.os.Handler.handleCallback(Handler.java:873)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:214)
            at android.app.ActivityThread.main(ActivityThread.java:7050)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)

我的代码看起来很简单:

    class MyActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            setContent {
                MaterialTheme {
                    Text(text = "compose")
                }
            }
        }
    }

更新

显然你需要使用 androidx.appcompat:appcompat:1.3.0-beta01

解决方法

尝试将 AppCompat 的依赖项更新为 rc01 版本。 这为我解决了问题。

implementation 'androidx.appcompat:appcompat:1.3.0-rc01'

,

我遇到了与 BottomSheetDialogFragment 相同的问题 您必须将 fragment 升级到 1.3.1

感谢@clapa-lucian,您可以在此issue

中找到更多相关信息 ,

因为没有一个解决方案对我有用,所以我来这里是为了让您的一天更轻松(假设您拥有我为我的项目所做的配置)。

所以,这是升级到 beta01 后没有启动的活动:

class AuthenticationActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        supportFragmentManager.beginTransaction()
            .replace(android.R.id.content,SignInFragment())
            .commit()
    }
}

如您所见,此处没有 setContentView(...)。在分析堆栈跟踪后,我看到 setTag(R.id.view_tree_lifecycle_owner,lifecycleOwner) 没有得到执行,这导致 getTag() 返回 null - 因此出现异常。

事实证明,当执行任何 setTag(...) 重载时,会调用 setContentView()

因此,我的设置的简单解决方法是引入一个冗余的 setContentView(View(this)),它会在内部设置生命周期所有者:

class AuthenticationActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(View(this)) // <-- here's the newly introduced line
        supportFragmentManager.beginTransaction()
            .replace(android.R.id.content,SignInFragment())
            .commit()
    }
}
,

AppCompatActivity 切换到 FragmentActivity 解决了我的问题。

,

androidx.appcompat:appcompat1.2.0 升级到 1.3.1 为我解决了这个问题。

TLDR: 更新

implementation "androidx.appcompat:appcompat:1.2.0"

implementation "androidx.appcompat:appcompat:1.3.1"