调用collectAsState相关方法时出现LocalLifecycleOwner缺失异常求助
解决
CompositionLocal LocalLifecycleOwner not present异常 问题背景
调用collectAsState()或collectAsStateWithLifecycle()方法时触发java.lang.IllegalStateException: CompositionLocal LocalLifecycleOwner not present异常,功能此前正常运行,更换M1设备并更新依赖后出现问题。
错误栈信息
java.lang.IllegalStateException: CompositionLocal LocalLifecycleOwner not present at androidx.lifecycle.compose.LocalLifecycleOwnerKt$LocalLifecycleOwner$1.invoke(LocalLifecycleOwner.kt:26) at androidx.lifecycle.compose.LocalLifecycleOwnerKt$LocalLifecycleOwner$1.invoke(LocalLifecycleOwner.kt:25) at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74) at androidx.compose.runtime.LazyValueHolder.getCurrent(ValueHolders.kt:29) at androidx.compose.runtime.LazyValueHolder.getValue(ValueHolders.kt:31) at androidx.compose.runtime.CompositionLocalMapKt.read(CompositionLocalMap.kt:90) at androidx.compose.runtime.ComposerImpl.consume(Composer.kt:2135) at androidx.lifecycle.compose.FlowExtKt.collectAsStateWithLifecycle(FlowExt.kt:182) at com.codejockie.wani.MainActivity$onCreate$1.invoke(MainActivity.kt:47) at com.codejockie.wani.MainActivity$onCreate$1.invoke(MainActivity.kt:45) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35) at androidx.compose.ui.platform.ComposeView.Content(ComposeView.android.kt:428) at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:252) at androidx.compose.ui.platform.AbstractComposeView$ensureCompositionCreated$1.invoke(ComposeView.android.kt:251) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35) at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228) at androidx.compose.ui.platform.CompositionLocalsKt.ProvideCommonCompositionLocals(CompositionLocals.kt:186) at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:119) at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt$ProvideAndroidCompositionLocals$3.invoke(AndroidCompositionLocals.android.kt:118) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35) at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228) at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt.ProvideAndroidCompositionLocals(AndroidCompositionLocals.android.kt:110) at androidx.compose.ui.platform.WrappedComposition$setContent$1$1$2.invoke(Wrapper.android.kt:139) at androidx.compose.ui.platform.WrappedComposition$setContent$1$1$2.invoke(Wrapper.android.kt:138) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35) at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:248) at androidx.compose.ui.platform.WrappedComposition$setContent$1$1.invoke(Wrapper.android.kt:138) at androidx.compose.ui.platform.WrappedComposition$setContent$1$1.invoke(Wrapper.android.kt:123) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35) at androidx.compose.runtime.ActualJvm_jvmKt.invokeComposable(ActualJvm.jvm.kt:90) at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:3302) at androidx.compose.runtime.ComposerImpl.composeContent$runtime_release(Composer.kt:3235) at androidx.compose.runtime.CompositionImpl.composeContent(Composition.kt:725) at androidx.compose.runtime.Recomposer.composeInitial$runtime_release(Recomposer.kt:1071) at androidx.compose.runtime.CompositionImpl.composeInitial(Composition.kt:633) at androidx.compose.runtime.CompositionImpl.setContent(Composition.kt:619) at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:123) at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:114) at androidx.compose.ui.platform.AndroidComposeView.setOnViewTreeOwnersAvailable(AndroidComposeView.android.kt:1289) at androidx.compose.ui.platform.WrappedComposition.setContent(Wrapper.android.kt:114) at androidx.compose.ui.platform.WrappedComposition.onStateChanged(Wrapper.android.kt:164) at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.jvm.kt:320) at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.jvm.kt:198) at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:121) at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:114) at androidx.compose.ui.platform.AndroidComposeView.onAttachedToWindow(AndroidComposeView.android.kt:1364) at android.view.View.dispatchAttachedToWindow(View.java:22257) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3494) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3501) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3501) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3501) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3501) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3501) at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3501) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3207) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2659) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9789) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1399) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1408) at android.view.Choreographer.doCallbacks(Choreographer.java:1008) at android.view.Choreographer.doFrame(Choreographer.java:938) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1382) at android.os.Handler.handleCallback(Handler.java:959) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loopOnce(Looper.java:232) at android.os.Looper.loop(Looper.java:317) at android.app.ActivityThread.main(ActivityThread.java:8501) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:878)
依赖配置
dependencies { implementation("androidx.core:core-ktx:1.13.1") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.0") implementation("androidx.activity:activity-compose:1.9.0") implementation(platform("androidx.compose:compose-bom:2024.05.00")) implementation("androidx.compose.foundation:foundation") implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui-text") implementation("androidx.compose.ui:ui-graphics") implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.compose.material3:material3") implementation("androidx.navigation:navigation-compose:2.7.7") implementation("androidx.appcompat:appcompat:1.6.1") // DataStore implementation("androidx.datastore:datastore:1.1.1") // Glide implementation("com.github.bumptech.glide:compose:1.0.0-beta01") // Hilt implementation("com.google.dagger:hilt-android:2.51") ksp("com.google.dagger:hilt-android-compiler:2.51") annotationProcessor("com.google.dagger:hilt-android:2.51") implementation("androidx.hilt:hilt-navigation-compose:1.2.0") implementation("androidx.hilt:hilt-work:1.2.0") ksp("androidx.hilt:hilt-compiler:1.2.0") // Kotlin Serialization implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1") // Lifecycle implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.0") implementation("androidx.lifecycle:lifecycle-extensions:2.2.0") implementation("androidx.lifecycle:lifecycle-runtime-compose:2.8.0") // LiveData implementation("androidx.compose.runtime:runtime-livedata") // Media implementation("androidx.media3:media3-exoplayer:1.3.1") implementation("androidx.media3:media3-ui:1.3.1") implementation("androidx.media3:media3-session:1.3.1") // OkHttp implementation(platform("com.squareup.okhttp3:okhttp-bom:4.11.0")) implementation("com.squareup.okhttp3:okhttp") implementation("com.squareup.okhttp3:logging-interceptor") // Protobuf implementation("com.google.protobuf:protobuf-javalite:3.18.0") // Retrofit implementation("com.squareup.retrofit2:retrofit:2.9.0") implementation("com.squareup.retrofit2:converter-gson:2.9.0") // Room implementation("androidx.room:room-runtime:2.6.1") annotationProcessor("androidx.room:room-compiler:2.6.1") ksp("androidx.room:room-compiler:2.6.1") implementation("androidx.room:room-ktx:2.6.1") // WorkManager implementation("androidx.work:work-runtime-ktx:2.9.0") // Test dependencies testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") androidTestImplementation(platform("androidx.compose:compose-bom:2024.05.00")) androidTestImplementation("androidx.compose.ui:ui-test-junit4") androidTestImplementation("androidx.navigation:navigation-testing:2.7.7") androidTestImplementation("androidx.work:work-testing:2.9.0") debugImplementation("androidx.compose.ui:ui-tooling") debugImplementation("androidx.compose.ui:ui-test-manifest") testImplementation("androidx.room:room-testing:2.6.1") }
MainActivity代码
class MainActivity : AppCompatActivity() { private val mainViewModel by viewModels<MainViewModel>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { val context = LocalContext.current val uiState by mainViewModel.uiState.collectAsStateWithLifecycle() App( closeApp = { this.finish() }, appState = uiState, ) } } }
解决方案
1. 移除废弃的lifecycle-extensions依赖
androidx.lifecycle:lifecycle-extensions:2.2.0已被官方废弃,且当前项目已引入lifecycle-runtime-ktx、lifecycle-viewmodel-ktx等2.8.0版本的独立依赖,旧版本依赖会导致生命周期组件冲突,直接删除该依赖:
// 移除这一行 implementation("androidx.lifecycle:lifecycle-extensions:2.2.0")
2. 统一依赖兼容性检查
- 确保
activity-compose与compose-bom版本匹配:当前compose-bom:2024.05.00对应的activity-compose推荐版本为1.9.0,当前配置符合要求。 - 检查Hilt依赖版本:
hilt-navigation-compose:1.2.0与hilt-android:2.51存在版本不兼容风险,建议将hilt-navigation-compose升级到对应匹配版本,或者同步升级Hilt到2.51.1及以上版本,确保依赖版本一致。
3. 清理项目缓存
M1设备可能存在构建缓存异常,执行以下命令清理缓存后重新构建:
./gradlew cleanBuildCache ./gradlew clean assembleDebug
4. 临时显式指定LifecycleOwner(可选)
若以上方法未生效,可临时在collectAsStateWithLifecycle()中显式传入Activity作为LifecycleOwner,绕过CompositionLocal注入问题:
val uiState by mainViewModel.uiState.collectAsStateWithLifecycle(lifecycleOwner = this@MainActivity)
内容的提问来源于stack exchange,提问作者codejockie
相关产品推荐
相关产品推荐

