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

如何通过NavController向打开的Fragment传递布尔类型参数?

问题

我的Activity中有一个通过Uri打开Fragment的navigate方法,代码如下:

...
fun navigate(uri: Uri, savedInstanceState: Bundle?) {
    with(supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment) {
        val authGraph: NavGraph = navController.navInflater.inflate(R.navigation.auth_nav_graph)
        maybeSetIapNavGraphs(navHostFragment.navController, authGraph)
        navController.graph = authGraph

        if (savedInstanceState == null) {
            navController.popBackStack()
            navController.navigate(uri)
        }
    }
}
...

我需要向即将打开的Fragment传递一个布尔值,但发现带Uri参数的navigate方法不接收Bundle,仅有的重载是.navigate(uri, NavOptions),似乎无法传递Bundle。

我曾尝试以下方式:

...
fun navigate(uri: Uri, savedInstanceState: Bundle?) {
    with(supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment) {
        val authGraph: NavGraph = navController.navInflater.inflate(R.navigation.auth_nav_graph)
        maybeSetIapNavGraphs(navHostFragment.navController, authGraph)

        val bundle = Bundle().apply { putInt("isEnabled", 1) }
        navController.setGraph(authGraph, bundle)

        if (savedInstanceState == null) {
            navController.popBackStack()
            navController.navigate(uri)
        }
    }
}
...

但在Fragment中通过val arg1Value = requireArguments().getInt("isEnabled")获取值时,得到的结果是0。请问如何正确向Fragment传递布尔值?

解决方案

方法一:将参数附加到Uri中

直接把布尔参数编码到Uri的查询参数里,在Fragment中解析Uri获取值。

修改Activity中的navigate方法:

fun navigate(uri: Uri, savedInstanceState: Bundle?) {
    // 给原Uri添加布尔查询参数
    val uriWithArgs = uri.buildUpon()
        .appendQueryParameter("is_enabled", "true") // 替换为实际布尔值变量
        .build()

    with(supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment) {
        val authGraph: NavGraph = navController.navInflater.inflate(R.navigation.auth_nav_graph)
        maybeSetIapNavGraphs(navHostFragment.navController, authGraph)
        navController.graph = authGraph

        if (savedInstanceState == null) {
            navController.popBackStack()
            navController.navigate(uriWithArgs)
        }
    }
}

在目标Fragment中解析参数:

// 获取导航传递的Uri
val deepLinkUri = requireArguments().getString(NavController.KEY_DEEP_LINK_URI)?.let { Uri.parse(it) }
// 解析布尔参数,设置默认值为false
val isEnabled = deepLinkUri?.getBooleanQueryParameter("is_enabled", false) ?: false

方法二:使用NavDeepLinkRequest传递Bundle

通过NavDeepLinkRequest构建导航请求,直接附加参数Bundle,这是更直接的参数传递方式。

修改Activity中的navigate方法:

fun navigate(uri: Uri, savedInstanceState: Bundle?) {
    with(supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment) {
        val authGraph: NavGraph = navController.navInflater.inflate(R.navigation.auth_nav_graph)
        maybeSetIapNavGraphs(navHostFragment.navController, authGraph)
        navController.graph = authGraph

        if (savedInstanceState == null) {
            navController.popBackStack()
            
            // 创建包含布尔参数的Bundle
            val argsBundle = Bundle().apply {
                putBoolean("isEnabled", true) // 替换为实际布尔值变量
            }
            
            // 构建DeepLink请求
            val deepLinkRequest = NavDeepLinkRequest.Builder
                .fromUri(uri)
                .build()
            
            // 使用带Bundle的重载方法完成导航
            navController.navigate(deepLinkRequest, argsBundle)
        }
    }
}

在目标Fragment中直接获取参数:

val isEnabled = requireArguments().getBoolean("isEnabled", false)

关于你之前尝试的问题说明

你之前用setGraph(authGraph, bundle)设置的是导航图的全局参数,但后续调用navigate(uri)启动的目标Fragment并不会自动继承这个全局参数,所以无法获取到值。这种方式适用于给整个导航图内的所有目的地传递通用参数,而非单个目的地,因此不适合你的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:27:42