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

点击按钮时Jetpack Compose导航导致应用崩溃问题排查

问题分析与修复方案

你的代码存在两个核心问题,直接导致了导航时的空指针崩溃,我来一步步拆解并给出修复方案:

1. 最关键错误:MainActivity未加载导航宿主(NavHost)

你在MainActivity里直接渲染了Home组件,而非你定义的navigationDraft导航宿主组件。这会造成:

  • 传给Home的navController是一个孤立实例,没有和任何NavHost绑定
  • 导航操作必须依赖NavHost管理页面栈,没有它的话,NavController根本无法执行导航逻辑,调用navigate时自然触发空指针异常

2. 次要错误:navigationDraft组件重复创建NavController

你给navigationDraft函数定义了navController参数,但在函数内部又重新调用rememberNavController()创建了新实例,这不仅浪费了传入的参数,还容易造成逻辑混乱。


修复步骤

第一步:修改MainActivity,加载导航宿主

把MainActivity里直接渲染Home的代码改成渲染navigationDraft:

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    setContent { 
        Users_plofile_kotlinTheme { 
            Surface( 
                modifier = Modifier.fillMaxSize(), 
                color = MaterialTheme.colors.background 
            ) { 
                navigationDraft() // 直接调用导航组件,无需在这里创建navController
                nameViewModel.getUserNameList() 
            } 
        } 
    } 
}

第二步:修复navigationDraft组件

去掉多余的navController参数,直接在组件内部创建并关联到NavHost:

@Composable 
fun navigationDraft() { 
    val navController = rememberNavController() 
    NavHost( 
        navController = navController, 
        startDestination = ScreenNavigation.Home.routeName 
    ) { 
        composable(route = ScreenNavigation.Home.routeName) { 
            Home(navController = navController) 
        } 
        composable(route = ScreenNavigation.DetailedScreen.routeName) { 
            DetailedScreen(navController = navController) 
        } 
    } 
}

可选优化:修复DetailedScreen的布局遮挡问题

你的DetailedScreen里的Scaffold没有使用它提供的内边距参数,会导致内容被TopAppBar遮挡,建议修改:

@Composable 
fun DetailedScreen(navController: NavController) { 
    Scaffold(
        topBar = {
            TopAppBar(elevation = 2.dp, backgroundColor = Color.Magenta) { 
                Text(text = "Second Screen With Detail", fontStyle = FontStyle.Italic) 
            }
        }
    ) { innerPadding -> 
        Column(
            modifier = Modifier
                .fillMaxSize()
                .padding(innerPadding),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) { 
            Text(text = "Hi", fontSize = 30.sp) 
        } 
    } 
}

崩溃原因说明

当你在MainActivity里直接给Home传一个孤立的navController时,这个实例没有被任何NavHost关联——NavHost是导航系统的核心,负责维护页面栈、处理导航请求。没有它的话,navController内部的导航相关对象都是空的,调用navigate()时就会触发NullPointerException。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:13:11