JetPack Compose点击LazyColumn项跳转至详情视图的实现问题
所有带@Composable注解的函数都有特殊的上下文要求,只能在同样被@Composable标记的函数作用域内调用。普通回调(比如点击事件回调、未加@Composable注解的自定义lambda参数)都不属于合法的Composable调用上下文,在这些位置调用Composable函数就会触发你遇到的错误。
你目前贴出的导航逻辑本身是符合规范的,错误大概率出自以下两个位置:
1. JetFirestore组件的内容回调未声明为Composable类型
你把LazyColumn、加载动画等Composable内容写在了JetFirestore的末尾trailing lambda参数中,如果JetFirestore对这个参数的定义没有添加@Composable注解,这个lambda的上下文就不允许调用任何Composable函数,直接触发报错。
解决方法:找到JetFirestore的声明,给末尾的内容lambda参数加@Composable注解:
// 错误的参数声明示例 fun JetFirestore( // 其他参数省略 content: () -> Unit // 未加@Composable ) // 正确的参数声明 fun JetFirestore( // 其他参数省略 @Composable content: () -> Unit // 加上@Composable注解 )
同时要确保JetFirestore内部调用content的位置本身也处于Composable上下文内。
2. 错误地在点击回调中直接调用Profile页面
如果你之前试过在Modifier.clickable的回调里直接写Profile(autor.nombre)来跳转页面,也会触发报错。点击事件回调是普通非Composable上下文,不能直接实例化页面Composable。你当前通过navigateToProfile回调调用navController.navigate的逻辑是正确的,不需要修改,路由跳转统一由NavHost在自身的Composable上下文里处理目标页面的实例化即可。
- 确认
Profile组件本身已经添加@Composable注解 - 如果
autor.nombre包含斜杠、空格等特殊字符,拼接路由时先用Uri.encode编码,获取参数时再用Uri.decode解码,避免路由匹配失败 - 确保
Profile.route的定义不包含斜杠,避免路由拼接出现格式错误
内容的提问来源于stack exchange,提问作者Komito

