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

迁移至Indication和Ripple API后LargeFloatingActionButton二次点击崩溃

修复Compose Material3自定义FAB二次点击崩溃问题

问题根源

崩溃是由于通过CompositionLocalProvider将LocalRippleConfiguration设为null,Material3的LargeFloatingActionButton内部涟漪节点管理逻辑在配置动态切换时,出现委托节点找不到的异常。

修复方案

直接利用Material3按钮内置的enabled参数处理状态,无需手动修改LocalRippleConfiguration。按钮本身会根据enabled状态自动禁用涟漪、拦截点击事件并调整视觉样式。

修改后的代码:

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun LargeFloatingActionButtonCustom(
    icon: ImageVector,
    contentDescription: String,
    onClick: () -> Unit,
    enabled: Boolean = true
) {
    LargeFloatingActionButton(
        modifier = Modifier.size(52.dp),
        shape = CircleShape,
        containerColor = if (enabled) MaterialTheme.colorScheme.primaryContainer else MaterialTheme.colorScheme.surfaceDim,
        onClick = onClick,
        enabled = enabled // 直接传递enabled参数,交由按钮内部处理交互与涟漪
    ) {
        Icon(
            imageVector = icon,
            contentDescription = contentDescription,
            tint = if (enabled) LocalContentColor.current else DarkGray
        )
    }
}

原理说明

Material3的LargeFloatingActionButton的enabled参数会自动处理:

  • 禁用状态下拦截点击事件,无需手动在onClick中判断
  • 自动隐藏涟漪效果,无需修改LocalRippleConfiguration
  • 可配合自定义颜色调整视觉状态(如你代码中的containerColor和Icon tint)

若因特殊需求必须自定义涟漪配置,请勿将LocalRippleConfiguration设为null,而是提供一个完全透明、无透明度变化的涟漪配置:

val disabledRipple = RippleConfiguration(
    rippleAlpha = RippleAlpha(0f, 0f, 0f, 0f),
    rippleColor = Color.Transparent
)

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun LargeFloatingActionButtonCustom(
    icon: ImageVector,
    contentDescription: String,
    onClick: () -> Unit,
    enabled: Boolean = true
) {
    CompositionLocalProvider(
        LocalRippleConfiguration provides if (enabled) LocalRippleConfiguration.current else disabledRipple
    ) {
        LargeFloatingActionButton(
            modifier = Modifier.size(52.dp),
            shape = CircleShape,
            containerColor = if (enabled) MaterialTheme.colorScheme.primaryContainer else MaterialTheme.colorScheme.surfaceDim,
            onClick = onClick,
            enabled = enabled
        ) {
            Icon(
                imageVector = icon,
                contentDescription = contentDescription,
                tint = if (enabled) LocalContentColor.current else DarkGray
            )
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 11:57:14