如何在函数参数中声明函数?Compose登录组件复用实现
封装Compose OutlinedTextField组件的解决方案
一、解决表达式传参问题
loginUiState?.userName ?: ""这类空安全表达式本身就是非空String类型,完全可以直接作为value: String参数传入封装组件,不需要额外转换。这个表达式的作用是:当loginUiState或userName为null时,自动兜底为空字符串,刚好匹配value参数的非空要求。
二、函数参数中声明函数的方法
在Compose组件封装中,针对不同类型的函数回调,需要声明对应的函数类型:
- 普通事件回调(如
onValueChange):声明为(参数类型) -> 返回值类型,比如输入文本变化回调是(String) -> Unit - Composable内容回调(如
leadingIcon、label):需要加上@Composable注解,声明为@Composable () -> Unit(无参无返回值)
三、完整封装与调用示例
1. Elements.kt中的封装代码
@Composable fun LoginOutlinedTextField( // 可选参数,设置默认值简化调用 modifier: Modifier = Modifier, // 输入框当前值,非空String value: String, // 文本变化回调,接收输入的字符串 onValueChange: (String) -> Unit, // 前置图标,Composable类型,默认空实现 leadingIcon: @Composable () -> Unit = {}, // 输入框标签,Composable类型 label: @Composable () -> Unit, // 是否显示错误状态,默认false isError: Boolean = false ) { OutlinedTextField( modifier = modifier.padding(20.dp), value = value, onValueChange = onValueChange, leadingIcon = leadingIcon, label = label, isError = isError ) }
2. Login.kt中的调用代码
LoginOutlinedTextField( value = loginUiState?.userName ?: "", onValueChange = { loginViewModel?.onUserNameChange(it) }, leadingIcon = { Icon(imageVector = Icons.Default.Email, contentDescription = null) }, label = { Text(text = "Email") }, isError = isEerror )
补充说明
- 给可选参数设置默认值(如
modifier、leadingIcon、isError)可以减少调用时的冗余代码 - 如果需要更灵活的配置(比如支持密码隐藏、占位符等),可以在封装组件中添加更多参数并传递给底层的
OutlinedTextField
内容的提问来源于stack exchange,提问作者g1code
相关产品推荐
相关产品推荐

