Compose学习
自定义组件

Compose 自定义组件

基础概念

组件封装

@Composable
fun CustomButton(
    text: String,
    onClick: () -> Unit,
    modifier: Modifier = Modifier
) {
    Button(
        onClick = onClick,
        modifier = modifier,
        colors = ButtonDefaults.buttonColors(
            backgroundColor = MaterialTheme.colors.primary
        )
    ) {
        Text(text)
    }
}

状态管理

class CustomComponentState(
    initialValue: String = ""
) {
    var text by mutableStateOf(initialValue)
    var isEnabled by mutableStateOf(true)
}
 
@Composable
fun rememberCustomComponentState(
    initialValue: String = ""
) = remember { CustomComponentState(initialValue) }

高级特性

生命周期管理

@Composable
fun CustomComponent(
    onDispose: () -> Unit
) {
    DisposableEffect(Unit) {
        onDispose {
            onDispose()
        }
    }
    
    // 组件内容
}

副作用处理

@Composable
fun CustomDataComponent(
    data: Flow<String>
) {
    var text by remember { mutableStateOf("") }
    
    LaunchedEffect(Unit) {
        data.collect { newData ->
            text = newData
        }
    }
    
    Text(text)
}

布局定制

自定义布局

@Composable
fun CustomLayout(
    modifier: Modifier = Modifier,
    content: @Composable () -> Unit
) {
    Layout(
        content = content,
        modifier = modifier
    ) { measurables, constraints ->
        // 测量子元素
        val placeables = measurables.map { measurable ->
            measurable.measure(constraints)
        }
 
        // 确定布局大小
        val width = placeables.maxOf { it.width }
        val height = placeables.sumOf { it.height }
 
        // 放置子元素
        layout(width, height) {
            var yPosition = 0
            placeables.forEach { placeable ->
                placeable.placeRelative(x = 0, y = yPosition)
                yPosition += placeable.height
            }
        }
    }
}

手势处理

@Composable
fun CustomGestureComponent(
    onDrag: (Offset) -> Unit,
    modifier: Modifier = Modifier
) {
    Box(modifier = modifier
        .pointerInput(Unit) {
            detectDragGestures { change, dragAmount ->
                change.consume()
                onDrag(dragAmount)
            }
        }
    )
}

实用技巧

组合模式

@Composable
fun CustomCard(
    modifier: Modifier = Modifier,
    content: @Composable () -> Unit
) {
    Card(
        modifier = modifier,
        elevation = 4.dp
    ) {
        content()
    }
}
 
// 使用示例
CustomCard {
    Column {
        Text("标题")
        Text("内容")
    }
}

性能优化

@Composable
fun OptimizedList(
    items: List<Item>,
    modifier: Modifier = Modifier
) {
    LazyColumn(modifier = modifier) {
        items(
            items = items,
            key = { it.id }
        ) { item ->
            key(item.id) {
                ItemRow(item)
            }
        }
    }
}

可访问性支持

@Composable
fun AccessibleCustomComponent(
    onClick: () -> Unit,
    contentDescription: String
) {
    Box(
        modifier = Modifier
            .clickable(onClick = onClick)
            .semantics {
                this.contentDescription = contentDescription
                this.role = Role.Button
            }
    ) {
        // 组件内容
    }
}