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

使用Typesafe Navigation时崩溃,抛出IllegalStateException:必须先调用setGraph()才能调用getGraph()

使用Typesafe Navigation时崩溃,抛出IllegalStateException:必须先调用setGraph()才能调用getGraph()

嘿,我刚接触Compose导航的时候也踩过这个一模一样的坑!先理清楚你的问题:
这是我的第一个Android应用,目前正在做导航部分。现在遇到的麻烦是,每当我点击IconButton想要跳转到添加笔记页面时,应用直接崩溃,抛出这个异常:

java.lang.IllegalStateException: You must call setGraph() before calling getGraph()

你提到在MainActivity里的代码大概是这样的(虽然没写完,但核心问题基本出在导航初始化环节):

val navController = rememberNavController()  
NavHost(  
    navController = nav的内容...

这个错误的核心原因其实很直白:你的NavController还没绑定对应的导航图(navGraph),就被用来执行导航操作了。给你几个具体的解决方向,按顺序排查就行:

  • 确保NavHost正确关联导航图
    一定要在NavHost的参数里明确指定导航图,或者通过startDestination配合导航图定义完成绑定。比如你的导航图文件是R.navigation.nav_graph的话,代码应该这么写:

    val navController = rememberNavController()
    NavHost(
        navController = navController,
        navGraph = navGraph(R.navigation.nav_graph),
        startDestination = "main_screen"
    ) {
        composable("main_screen") { 
            MainScreen(onAddNoteClick = {
                // 用和NavHost绑定的同一个navController执行导航
                navController.navigate("add_note_screen")
            }) 
        }
        composable("add_note_screen") { AddNoteScreen() }
    }
    
  • 确认导航用的是同一个NavController实例
    别犯这种低级小错误:比如在MainScreen子组件里又重新创建了一个rememberNavController(),这时候你点击按钮用的是全新的控制器,根本没和NavHost绑定,自然会触发报错。一定要把和NavHost绑定的那个navController传递给子组件使用。

  • 避免提前调用导航操作
    如果你是在组件刚加载时就想自动执行导航(比如启动页跳转),别直接在rememberNavController()之后就调用navController.navigate(),要把导航逻辑放在LaunchedEffect里,等NavHost初始化完成后再执行:

    LaunchedEffect(Unit) {
        navController.navigate("add_note_screen")
    }
    

你先按这几点检查一遍,大概率就能解决问题了!

备注:内容来源于stack exchange,提问作者Shehara Nayanananda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:39:44