You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose中NavController强制屏幕旋转时崩溃问题求助

问题解决:Jetpack Compose导航时屏幕方向切换导致崩溃的修复方案

崩溃原因

直接在Composable根作用域中设置屏幕方向并立即调用navigate,会触发Activity因方向切换重建,此时NavController的导航流程尚未完成,内部状态不一致,从而抛出java.lang.IllegalStateException: no event down from INITIALIZED异常。

修复方案

通过LaunchedEffect确保屏幕方向设置和导航操作在Composable进入组合后安全执行,同时用DisposableEffect在页面退出时恢复方向,避免影响其他页面。

1. 修正第一个页面(横屏页面)代码

@Composable
fun SimpleCameraPreview(navController: NavController) {
    val activity = LocalContext.current as Activity

    // 仅在页面首次进入组合时设置横屏
    LaunchedEffect(Unit) {
        activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE
        // 在LaunchedEffect内执行导航,确保NavController状态稳定
        navController.navigate("NFCReader")
    }

    // 页面退出时恢复默认方向
    DisposableEffect(Unit) {
        onDispose {
            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
        }
    }
}

2. 修正第二个页面(竖屏页面)代码

@Composable
fun NFCReader() {
    val activity = LocalContext.current as Activity

    // 仅在页面首次进入组合时设置竖屏
    LaunchedEffect(Unit) {
        activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
    }

    // 页面退出时恢复默认方向
    DisposableEffect(Unit) {
        onDispose {
            activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
        }
    }
}

关键优化点

  • LaunchedEffect:确保代码在Composable完成初始化、状态稳定后执行,避免干扰NavController的导航流程。
  • DisposableEffect:页面销毁时恢复屏幕方向,防止后续页面被错误锁定方向。
  • 若导航是由用户交互(如按钮点击)触发,只需将navigate放在点击事件中,屏幕方向设置仍保留在LaunchedEffect内即可。

内容的提问来源于stack exchange,提问作者Fred

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 12:35:08