android - 如何在 Jetpack Compose 中制作可重用的组件?

标签 android kotlin components android-jetpack-compose android-jetpack

我正在尝试创建一个 TextField 可重用组件,所以我这样做了

@Composable
fun TextFieldComponent(state: Any, placeholder: String) {
    TextField(
        value = state,
        onValueChange = { textFieldValue -> state = textFieldValue },
        placeholder = { Text(placeholder, color = MaterialTheme.colors.secondary) }
    )
}

但我遇到了这些错误

enter image description here

这就是我调用组件的方式

val textFieldState by rememberSaveable { mutableStateOf("") }
TextFieldComponent(state = textFieldState, placeholder = "Email")

那么有什么解决办法吗?

最佳答案

只需转state进入MutableState<String> , 所以你可以从函数内部修改它:

@Composable
fun TextFieldComponent(state: MutableState<String>, placeholder: String) {
    TextField(
        value = state.value,
        onValueChange = { textFieldValue -> state.value = textFieldValue },
        placeholder = { Text(placeholder, color = MaterialTheme.colors.secondary) }
    )
}

但是,通常更可取的是为可组合函数提供一个值和一个更改监听器:

@Composable
fun TextFieldComponent2(value: String, onValueChange: (String) -> Unit, placeholder: String) {
    TextField(
        value = value,
        onValueChange = { textFieldValue -> onValueChange(textFieldValue) },
        placeholder = { Text(placeholder, color = MaterialTheme.colors.secondary) }
    )
}

这样的解决方案更灵活,因为调用者可以很容易地提供值变化的任何行为(感谢@Jakoss)

关于android - 如何在 Jetpack Compose 中制作可重用的组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69885391/

相关文章:

Android TV Emulator Play 商店登录

android - 您的发帖请求未及时收到,请重试

android - 为什么作者在一个项目中定义一个空白接口(interface)?

angular - 通过 ComponentFactoryResolver 创建组件时更改检测不起作用

javascript - Ember 无标签组件 innerhtml

android - 发布时,显示支持 70 多种语言,但我的应用只有两种

android - 如何将垂直滑动的 ViewPager 放入水平滑动的 ViewPager

kotlin - 当您的所有协程已经用 CouroutineExceptionHandler 包装时,如何发现 "Job was cancelled"异常的来源?

android - 这个 Kotlin FileFilter 有什么问题?

angular - 通过 Angular 组件将函数作为参数传递给(单击)事件