Compose 封装 - 倒计时消失容器

一、封装

  • 不要用封装 Dialog/AlertDialog 来实现弹窗。Dialog 作为基础组件就是个 Box 毫无意义,不必为了用它而多出很多不必要的代码 。AlertDialog 不基础但点击功能你往容器里传入的自定义界面也能实现。
  • 不要用收集 Flow 来实现倒数,collectAsState() 底层用了 remember 持久化,再次弹窗不会从头收集。
Kotlin 复制代码
/**
 * 根布局用Box,该容器与屏幕内容平级,以实现类似对话框弹窗效果。
 * @param maxCount 最大计数
 * @param isShow 是否显示容器
 * @param onDismiss 关闭容器显示
 * @param content 容器界面内容
 */
@Composable
fun CountDownContainer(
    maxCount: Int,
    isShow: Boolean,
    onDismiss: () -> Unit,
    content: @Composable (Int) -> Unit
) {
    var count by remember { mutableIntStateOf(maxCount) }
    LaunchedEffect(isShow) {
        //it是从0开始正数,+1才能减到0(尽管多数1秒)
        repeat(maxCount + 1) {
            count = maxCount - it
            delay(1000)
        }
    }
    if (count == 0) onDismiss()  //数到0就关闭容器
    if (isShow) {
        content(count)
    }
}

二、使用

Kotlin 复制代码
@Composable
private fun Demo(
) {
    var isShow by remember { mutableStateOf(false) }

    Button({
        isShowDialog = true
    }) { Text("点击弹窗") }

    CountDownContainer(
        maxCount = 5,
        isShow = isShow,
        onDismiss = { isShow = false }
    ) {
        Box(
            modifier = Modifier.size(200.dp).background(Color.Red),
            contentAlignment = Alignment.Center
        ) { Text("$it") }
    }
}
相关推荐
2501_915106321 小时前
iOS 证书类型及作用说明 账号证书与签名配置的完整解读
android·ios·小程序·https·uni-app·iphone·webview
九皇叔叔1 小时前
RHEL9 安装 MySQL 8.4.11.LTS 版本
android·mysql·adb
海兰1 小时前
【数据库】tdsql(MySQL )的事务隔离级别
android·数据库·mysql
哆啦A梦z1 小时前
Android BLE 实战:从小米手环 7 踩坑到完整连接框架
android
IKUN家族2 小时前
KMP全栈开发:从Android到AI Agent的技术演进与实践
android·人工智能
笑一下蒜了.2 小时前
Linux 存储多路径访问手册|multipath.conf 各配置段详解
android·linux·运维
凡泰AI2 小时前
如何通过小程序多端框架,让一个小程序同时运行在iOS、安卓、鸿蒙以及PC客户端,实现一次开发多端运行的效果
android·ios·小程序
一笑的小酒馆3 小时前
Androidiot扫地机器人设备详情页地图加载慢卡顿优化方案
android
xixiaoyunya4 小时前
安卓远程管理电脑/NAS文件:从传统SMB方案到Web化私有云的选型与落地实践
android·电脑
Zhu7589 小时前
在k8s集群部署MySQL单实例,支持多个主流发行版
android·mysql·kubernetes