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

