Jetpack Compose导航异常:无法从SignUpScreen跳转至LoginScreen
自定义路由跳转LoginScreen失效的解决方案
问题根源
你的BetteHomesAppRouter存在两个关键问题:
currentScreen是私有可变状态,外部无法监听其变化- 未提供只读的状态暴露方式,导航宿主无法感知页面切换指令
修复步骤
1. 完善路由管理类
修改AppRouter.kt,将内部可变状态封装,对外暴露只读的可观察状态:
package com.example.bettehomes.navigation import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf sealed class Screens(val route: String) { data object SignUpScreen : Screens("SignUpScreen") data object TermsAndConditionsScreen : Screens("termsAndConditions") data object LoginScreen : Screens("loginScreen") data object HomeScreen : Screens("homeScreen") data object MapScreen : Screens("mapScreen") data object GeoMarkerScreen : Screens("geoMarkerScreen") } object BetteHomesAppRouter { // 内部可变状态,仅内部修改 private val _currentScreen = mutableStateOf<Screens>(Screens.MapScreen) // 对外暴露只读状态,供外部观察 val currentScreen: State<Screens> = _currentScreen fun navigateTo(destination: Screens) { _currentScreen.value = destination } }
2. 确保导航宿主正确监听状态
在你的根Composable(比如BetteHomesApp)中,通过by语法监听currentScreen的变化,并根据状态渲染对应页面:
@Composable fun BetteHomesApp() { val currentScreen by BetteHomesAppRouter.currentScreen when (currentScreen) { Screens.SignUpScreen -> SignUpScreen() Screens.LoginScreen -> LoginScreen() Screens.TermsAndConditionsScreen -> TermsAndConditionsScreen() Screens.HomeScreen -> HomeScreen() Screens.MapScreen -> MapScreen() Screens.GeoMarkerScreen -> GeoMarkerScreen() } }
3. 验证点击组件的回调逻辑
检查LoginClickableTextComponent的实现,确保点击事件正确传递到onTextSelected回调:
@Composable fun LoginClickableTextComponent( tryingToLogin: Boolean, onTextSelected: () -> Unit ) { Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center ) { Text(text = if (tryingToLogin) "已有账号? " else "还没账号? ") ClickableText( text = AnnotatedString(if (tryingToLogin) "登录" else "注册"), onClick = { onTextSelected() } ) } }
额外检查点
- 确认
LoginScreen已正确实现,没有语法错误或渲染异常 - 测试时确保
signUpInProgress.value为false,避免加载指示器遮挡点击区域
内容的提问来源于stack exchange,提问作者Kaleab Woldemariam
相关产品推荐
相关产品推荐

