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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:24:52