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

Android开发求助:使用SharedViewModel传数据时应用崩溃

问题排查与修复方案

从你的代码来看,应用崩溃主要由以下几个明显的问题导致,逐一修复即可解决:

1. Home导航图路由不匹配导致崩溃

你的homeNavGraph中,navigation的startDestination设置为"Home",但实际定义的可组合项路由是"Home/{Username}",不存在名为"Home"的路由节点,启动导航时找不到目标页面直接崩溃。

修复代码:
调整homeNavGraph的startDestination为实际存在的路由:

fun NavGraphBuilder.homeNavGraph(navController: NavController){
    navigation(startDestination = "Home/{Username}", route = "Home"){
        composable(route = "Home/{Username}"){
            val Username = it.arguments?.getString("Username")?:" "
            HomeScreen(navController = navController, Username = Username)
        }

        composable(route = "detail"){
            val viewModel = it.sharedViewModel<SampleViewModel>(navController = navController)
            DetailScreen(navController = navController, viewModel = viewModel)
        }
    }
}

2. LoginScreen循环导航导致栈溢出

LoginScreen中的按钮点击事件是navController.navigate("Login"),这会不断向导航栈中添加同一个Login页面,最终触发栈溢出崩溃。

修复代码:
修改按钮点击逻辑,跳转到Home页面并传递输入的用户名,同时同步数据到SharedViewModel:

@Composable
fun LoginScreen(viewModel: SampleViewModel, navController: NavController){
    var username by remember {
        mutableStateOf("")
    }
    Box(modifier = Modifier
        .background(Color.Black)
        .fillMaxSize(),
        contentAlignment = Alignment.Center){

        Column(
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Text(text = "LOGIN",color = Color.White)

            TextField(
                value = username, 
                onValueChange = {
                    username = it
                    viewModel.username = it
                },
                label = { Text("Enter Username", color = Color.White) }
            )
            Button(onClick = { 
                navController.navigate("Home/${username}") 
            }) {
                Text(text = "Login")
            }
        }
    }
}

3. 缺少SharedViewModel核心定义

你声明了SampleViewModel但未给出具体实现,导致页面无法共享数据。

补充SampleViewModel定义:

import androidx.lifecycle.ViewModel
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue

class SampleViewModel : ViewModel() {
    var username by mutableStateOf("")
}

4. DetailScreen数据获取逻辑错误

原代码试图从arguments获取用户名,但跳转时未传递参数,改用SharedViewModel直接获取共享数据即可:

修复DetailScreen实现与调用:

// 定义DetailScreen
@Composable
fun DetailScreen(navController: NavController, viewModel: SampleViewModel){
    Box(modifier = Modifier
        .background(Color.Blue)
        .fillMaxSize()){
        Column(
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Text(text = "Welcome ${viewModel.username}", color = Color.White)
            Button(onClick = { navController.popBackStack() }) {
                Text(text = "Back to Home")
            }
        }
    }
}

// 修正homeNavGraph中的detail路由调用
composable(route = "detail"){
    val viewModel = it.sharedViewModel<SampleViewModel>(navController = navController)
    DetailScreen(navController = navController, viewModel = viewModel)
}

完成以上修复后,应用的导航逻辑和SharedViewModel数据共享功能即可正常运行,不会再出现崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:30:58