You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Jetpack Compose中如何解决ClickableText因LinkAnnotation相关的弃用警告问题?

Jetpack Compose中如何解决ClickableText因LinkAnnotation相关的弃用警告问题?

嗨,我来帮你搞定这个警告问题!这个提示其实是Compose官方在引导我们使用更简洁、更符合现代API设计的写法——用LinkAnnotation替代原来手动处理ClickableText点击偏移量的方式。

你之前尝试用Text/BasicText但没找到怎么加LinkAnnotation,其实是因为写法和原来的pushStringAnnotation不一样,我给你一步步拆解修改方案:

核心思路

原来的ClickableText配合pushStringAnnotation手动判断点击偏移的方式已经被官方推荐替换,现在我们可以直接在AnnotatedString中用LinkAnnotation定义可点击区域,然后用普通的Text组件就能自动处理点击逻辑,不需要再自己写偏移判断的代码。

修改后的完整代码

private const val GROUP_NAME_TAG = "groupName"

@Composable
fun ExpenseHeaderGroupWithDateText(
    modifier: Modifier = Modifier,
    date: ShimmerInformation<String>,
    groupName: String,
    groupNameClick: () -> Unit,
) {
    date.ToContent(
        loadingModifier = modifier
            .height(15.dp)
            .width(50.dp),
    ) { safeDate ->
        val annotatedText = buildAnnotatedString {
            withStyle(
                style = SpanStyle(
                    color = Black300,
                    fontSize = 14.sp,
                    fontWeight = FontWeight.W400,
                )
            ) {
                append("$safeDate ${stringResource(id = R.string.in_connector)} ")
            }
            // 替换原来的pushStringAnnotation,用LinkAnnotation定义点击行为
            pushLinkAnnotation(LinkAnnotation.Clickable(onClick = groupNameClick))
            withStyle(
                style = SpanStyle(
                    color = Black300,
                    fontSize = 14.sp,
                    fontWeight = FontWeight.W400,
                    textDecoration = TextDecoration.Underline
                )
            ) {
                append(groupName)
            }
            pop() // 弹出LinkAnnotation,结束当前可点击区域的定义
        }
        // 用普通Text组件替代ClickableText,它会自动识别并处理LinkAnnotation
        Text(
            modifier = modifier,
            text = annotatedText,
            overflow = TextOverflow.Ellipsis,
            maxLines = 1,
            // 可选:如果需要自定义链接的默认样式(比如未点击的颜色),可以在这里设置
            style = TextStyle(
                linkColor = Black300
            )
        )
    }
}

关键修改点说明

  1. 替换pushStringAnnotationpushLinkAnnotation:直接把点击回调groupNameClick传给LinkAnnotation.Clickable,不需要再通过tag去解析偏移量。
  2. Text替代ClickableTextText组件在Compose 1.4.0及以上版本已经支持识别AnnotatedString中的LinkAnnotation,自动处理点击事件,同时保留你需要的overflowmaxLines参数。
  3. 移除手动偏移判断逻辑:原来ClickableTextonClick里那段解析getStringAnnotations的代码可以完全删掉,因为LinkAnnotation已经帮我们处理了点击区域的识别。

注意事项

确保你的Compose版本在1.4.0或以上,因为LinkAnnotation是在这个版本才被引入的,如果版本过低需要先升级依赖哦。

备注:内容来源于stack exchange,提问作者Pierre Vieira

火山引擎 最新活动