问题描述
从撰写 alpha-11
更新到 alpha-12
(或 beta-01
)后,每当我打开具有撰写视图的活动或片段时,都会遇到此崩溃。
我正在使用实现 AppCompatActivity
的 LifecycleOwner
,所以这非常奇怪。
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:appcompat
从 1.2.0
升级到 1.3.1
为我解决了这个问题。
TLDR: 更新
implementation "androidx.appcompat:appcompat:1.2.0"
到
implementation "androidx.appcompat:appcompat:1.3.1"