Android Jetpack Compose - Compose 重组、AlertDialog、LazyColumn、Column 与 Row

一、Compose 重组

1、基本介绍
  1. 重组是 Compose 更新的唯一方式,当状态变化时,Compose 会重新执行受影响的 Composable 函数,生成新的 UI 描述

  2. MutableState<T> 是一个可观察的状态容器,它持有一个值,当这个值改变时,会通知所有订阅它的 Composable 函数进行重组

  3. remember 是一个 Composable 函数,用于在 Composable 函数重组时记住一个值

2、演示
(1)演示 1
kotlin 复制代码
@Composable
fun CounterDemo() {
    var count by remember { mutableStateOf(0) }

    println("CounterDemo 重组,count: $count")

    Button(onClick = { count++ }) {
        Text("点击了 $count  次")
    }
}
  1. 启动应用,输出结果如下

    CounterDemo 重组,count: 0

  2. 点击按钮,按钮文本发生变化,输出结果如下

    CounterDemo 重组,count: 1

(2)演示 2
kotlin 复制代码
var num = 10

@Composable
fun CounterDemo2() {
    println("CounterDemo2 重组,num: $num")

    Column {
        Button(onClick = { num++ }) {
            Text("点击了 $num  次")
        }

        Button(onClick = {
            println("[查看] 点击了 $num 次")
        }) {
            Text("查看 num")
        }
    }
}
  1. 启动应用,输出结果如下

    CounterDemo2 重组,num: 10

  2. 点击第一个按钮,按钮文本未发生变化,无输出结果

  3. 点击第二个按钮,输出结果如下

    [查看] 点击了 12 次

(3)演示 3
kotlin 复制代码
val count: MutableState<Int> = mutableStateOf(10)

@Composable
fun CounterDemo3() {
    println("CounterDemo3 重组,num: ${count.value}")

    Column {
        Button(onClick = { count.value++ }) {
            Text("点击了 ${count.value} 次")
        }

        Button(onClick = {
            println("[查看] 点击了 ${count.value} 次")
        }) {
            Text("查看 count")
        }
    }
}
  1. 启动应用,输出结果如下

    CounterDemo3 重组,num: 10

  2. 点击第一个按钮,按钮文本发生变化,输出结果如下

    CounterDemo3 重组,num: 11

  3. 点击第二个按钮,输出结果如下

    [查看] 点击了 11 次


二、AlertDialog

kotlin 复制代码
var showDialog by remember { mutableStateOf(false) }

Button(onClick = { showDialog = true }) {
    Text("显示对话框")
}

if (showDialog) {
    AlertDialog(
        onDismissRequest = { showDialog = false },
        title = { Text("确认删除") },
        text = { Text("确定要删除这条记录吗?") },
        confirmButton = {
            Button(onClick = {
                showDialog = false
            }) {
                Text("确定")
            }
        },
        dismissButton = {
            Button(onClick = {
                showDialog = false
            }) {
                Text("取消")
            }
        }
    )
}

三、LazyColumn

1、基本介绍

LazyColumn 是 Compose 中用于显示垂直滚动列表的组件,它只渲染当前屏幕可见的列表项,适用于大量数据列表的显示

2、演示
  1. LazyColumn 的基本使用
kotlin 复制代码
val items = listOf("Item 1", "Item 2", "Item 3", "Item 4", "Item 5")

LazyColumn {
    items(items.size) { index ->
        Text(
            text = items[index],
            modifier = Modifier.padding(16.dp),
            fontSize = 18.sp
        )
    }
}
kotlin 复制代码
val dataList = listOf("苹果", "香蕉", "橙子", "葡萄")

LazyColumn {
    itemsIndexed(dataList) { index, item ->
        Text(
            text = "第 ${index + 1} 项:$item",
            modifier = Modifier.padding(16.dp),
            fontSize = 18.sp
        )
    }
}
  1. 动态数据的 LazyColumn
kotlin 复制代码
val dataList = remember { mutableStateListOf("苹果", "香蕉", "橙子", "葡萄") }

Column {
    LazyColumn {
        itemsIndexed(dataList) { index, item ->
            Text(
                text = "第 ${index + 1} 项:$item",
                modifier = Modifier.padding(16.dp),
                fontSize = 18.sp
            )
        }
    }

    Button(
        onClick = {
            dataList.add("西瓜")
        }
    ) {
        Text(
            text = "添加",
            fontSize = 18.sp
        )
    }
}
kotlin 复制代码
var dataList by remember { mutableStateOf(listOf("苹果", "香蕉", "橙子", "葡萄")) }

Column {
    LazyColumn {
        itemsIndexed(dataList) { index, item ->
            Text(
                text = "第 ${index + 1} 项:$item",
                modifier = Modifier.padding(16.dp),
                fontSize = 18.sp
            )
        }
    }

    Button(
        onClick = {
            dataList = dataList + "西瓜"
        }
    ) {
        Text(
            text = "添加",
            fontSize = 18.sp
        )
    }
}
  1. LazyColumn 的点击事件
kotlin 复制代码
val dataList = remember { mutableStateListOf("苹果", "香蕉", "橙子", "葡萄") }

LazyColumn {
    itemsIndexed(dataList) { index, item ->
        Text(
            text = "第 ${index + 1} 项:$item",
            modifier = Modifier
                .padding(16.dp)
                .clickable { dataList.remove(item) },
            fontSize = 18.sp
        )
    }
}
  1. 带有列表头部的列表
kotlin 复制代码
val dataList = remember { mutableStateListOf("苹果", "香蕉", "橙子", "葡萄") }

LazyColumn {
    item {
        Text(
            text = "列表头部",
            modifier = Modifier.padding(16.dp),
            fontSize = 20.sp,
            fontWeight = FontWeight.Bold
        )
        Divider()
    }

    itemsIndexed(dataList) { index, item ->
        Text(
            text = "第 ${index + 1} 项:$item",
            modifier = Modifier
                .padding(16.dp)
                .clickable { dataList.remove(item) },
            fontSize = 18.sp
        )
    }
}

四、Column 与 Row

1、基本介绍
  • Column 和 Row 是 Compose 中用于线性排列子组件的核心布局容器,本质上是 Android 传统布局中 LinearLayout 的替代
  1. Column 用于垂直方向排列子组件,即从上到下

  2. Row 用于水平方向排列子组件,即从左到右

2、演示
  1. Column 的基本使用
kotlin 复制代码
Column(
    modifier = Modifier
        .background(Color.LightGray)
        .padding(16.dp)
) {
    Text(text = "第一个垂直子组件", modifier = Modifier.padding(4.dp))
    Text(text = "第二个垂直子组件", modifier = Modifier.padding(4.dp))
    Text(text = "第三个垂直子组件", modifier = Modifier.padding(4.dp))
}
  1. Row 的基本使用
kotlin 复制代码
Row(
    modifier = Modifier
        .background(Color.LightGray)
        .padding(16.dp)
) {
    Text(text = "第一个水平子组件", modifier = Modifier.padding(4.dp))
    Text(text = "第二个水平子组件", modifier = Modifier.padding(4.dp))
    Text(text = "第三个水平子组件", modifier = Modifier.padding(4.dp))
}
相关推荐
咩咩啃树皮8 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚9 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白10 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司11 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地12 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415912 小时前
TCP超时重传机制是为了解决什么问题?
java
HLC++12 小时前
Linux的进程间通信
android·linux·服务器
莫逸风14 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z1234567898615 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
爱笑鱼15 小时前
Binder(二):AIDL 生成的 Proxy、Stub 和 Parcel 到底在做什么?
android