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
相关产品推荐
相关产品推荐

