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))
}
相关推荐
孟陬11 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌11 小时前
一站式了解四种限流算法
java·后端·go
阿巴斯甜12 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
华仔啊12 小时前
Java 开发千万别给布尔变量加 is 前缀!很容易背锅
java
Kapaseker12 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
也些宝13 小时前
Java单例模式:饿汉、懒汉、DCL三种实现及最佳实践
java
xq952713 小时前
Andorid Google 登录接入文档
android
Nyarlathotep011313 小时前
SpringBoot Starter的用法以及原理
java·spring boot
wuwen513 小时前
WebFlux + Lettuce Reactive 中 SkyWalking 链路上下文丢失的修复实践
java