Compose中的自定义Modifier与ComposeView扩展

自定义Modifier基础

Modifier是Compose中用于修饰可组合项的强大工具。

  • Name
    特点
    Type
    features
    Description
    • 可重用的修饰逻辑
    • 链式调用
    • 提高代码可维护性
    • 支持组合使用
  • Name
    使用场景
    Type
    usage
    Description
    • 统一的样式定义
    • 复杂的修饰组合
    • 需要重复使用的修饰逻辑

自定义Modifier示例

fun Modifier.primaryButton() = composed {
    this.then(
        Modifier
            .padding(16.dp)
            .background(
                color = MaterialTheme.colorScheme.primary,
                shape = RoundedCornerShape(10.dp)
            )
            .shadow(elevation = 5.dp)
    )
}

// 使用方式
Button(
    onClick = {},
    modifier = Modifier.primaryButton()
) {
    Text("点击我")
}

ComposeView扩展

通过扩展ComposeView,可以创建可重用的自定义组件。

  • Name
    特点
    Type
    features
    Description
    • 更简洁的调用语法
    • 支持参数自定义
    • 提高代码可读性
    • 便于维护和修改
  • Name
    使用场景
    Type
    usage
    Description
    • 简化复杂组件的创建
    • 封装可复用的UI组件
    • 统一管理UI风格

ComposeView扩展示例

fun ComposeView.setContent(
    content: @Composable () -> Unit
) {
    setContent {
        MaterialTheme {
            content()
        }
    }
}

@Composable
fun CardContainer(
    modifier: Modifier = Modifier,
    cornerRadius: Dp = 10.dp,
    elevation: Dp = 5.dp,
    content: @Composable () -> Unit
) {
    Card(
        modifier = modifier,
        shape = RoundedCornerShape(cornerRadius),
        elevation = CardDefaults.cardElevation(elevation)
    ) {
        content()
    }
}

// 使用方式
CardContainer {
    Text("卡片内容")
}

实战应用

结合自定义Modifier和ComposeView扩展实现复杂的UI效果。

  • Name
    特点
    Type
    features
    Description
    • 组合多个修饰符
    • 支持动态参数
    • 复用度高
    • 代码更清晰
  • Name
    使用场景
    Type
    usage
    Description
    • 自定义动画效果
    • 统一的列表样式
    • 通用的状态处理

实战示例

fun Modifier.shake(
    animationSpec: InfiniteRepeatableSpec<Float> = infiniteRepeatable(
        animation = tween(100),
        repeatMode = RepeatMode.Reverse
    )
) = composed {
    var offsetX by remember { mutableStateOf(0f) }
    
    LaunchedEffect(Unit) {
        animate(
            initialValue = -10f,
            targetValue = 10f,
            animationSpec = animationSpec
        ) { value, _ ->
            offsetX = value
        }
    }
    
    Modifier.offset { IntOffset(offsetX.roundToInt(), 0) }
}

// 使用示例
Text(
    text = "输入错误!",
    modifier = Modifier.shake()
)

这篇文章对你有用吗?