Chrome自定义标签页返回异常:需两次返回才回到详情页求助
问题分析
你遇到的两次返回问题根源在于:你将Chrome自定义标签页的启动逻辑放在了独立的Composable页面中,NavHost会把这个空白Composable加入导航栈。当从详情页跳转到该路由时,导航栈新增了这个空白页,随后才启动自定义标签页。从自定义标签页返回时,首先回到的是这个空白Composable页面,再点击一次返回才会回到详情页,这就是需要两次返回的核心原因。
解决方案
提供两种可行方案,按需选择:
方式一:直接从详情页启动自定义标签页(推荐)
不为自定义标签页单独创建NavHost路由,直接在详情页的跳转逻辑中启动Chrome自定义标签页,避免向导航栈添加额外页面,返回时直接回到详情页。
代码示例:
// 在详情页面的跳转触发逻辑中(比如按钮点击事件) val context = LocalContext.current val targetUrl = "你的目标URL" // 替换为实际要跳转的URL val droppedUrl = targetUrl?.drop(6) val uri = Uri.parse(droppedUrl) val customTabsIntent = CustomTabsIntent.Builder().build() try { customTabsIntent.launchUrl(context, uri) } catch (e: Exception) { context.startActivity(Intent(Intent.ACTION_VIEW, uri)) } // 无需调用navController.navigate("webview?url=xxx")
方式二:保留路由但启动后立即弹出当前页面
如果必须通过NavHost路由处理,可在启动自定义标签页后,立即将当前空白Composable页面从导航栈中移除,避免干扰返回逻辑。
修改后的代码:
NavHost部分
composable( route = "webview?url={url}", arguments = listOf( navArgument("url") { type = NavType.StringType } ) ) { backStackEntry -> val url = backStackEntry.arguments?.getString(Utils.URL) val navController = LocalNavController.current // 获取当前导航控制器 ChromeCustomTab(url = url, navController = navController) }
ChromeCustomTab部分
@Composable fun ChromeCustomTab(url: String?, navController: NavController) { // 使用LaunchedEffect确保启动逻辑仅执行一次 LaunchedEffect(key1 = url) { val context = LocalContext.current val customTabsIntent = CustomTabsIntent.Builder().build() val droppedUrl = url?.drop(6) val uri: Uri = Uri.parse(droppedUrl) try { customTabsIntent.launchUrl(context, uri) } catch (e: Exception) { context.startActivity(Intent(Intent.ACTION_VIEW, uri)) } // 启动自定义标签页后,立即从导航栈移除当前页面 navController.popBackStack() } // 无需编写布局内容,页面会被立即弹出 }
内容的提问来源于stack exchange,提问作者Alex20280
相关产品推荐
相关产品推荐

