Android 如何提升多个状态?

Android 如何提升多个状态?,android,android-view,android-jetpack-compose,Android,Android View,Android Jetpack Compose,当我们谈论这个问题的时候,我们肯定会面临这样的问题。这很舒服,不需要火箭科学知识。但这里有一堆其他的问题和另一堆可能的解决方案。这就是通过fun声明传递的大量参数。回到过去的好日子,我们可以允许自己拥有一个容器,其中可以容纳大部分参数(简单的一个)。另一方面,我们可以使用默认参数,但在任何情况下,这都无助于处理多行(大量)函数声明。有什么想法吗 如果我们再深入一点,查看androidx.compose.*.**(材料即)包,我们会发现许多组件实际上有许多用于状态提升的参数(lambda)。因此,

当我们谈论这个问题的时候,我们肯定会面临这样的问题。这很舒服,不需要火箭科学知识。但这里有一堆其他的问题和另一堆可能的解决方案。这就是通过fun声明传递的大量参数。回到过去的好日子,我们可以允许自己拥有一个容器,其中可以容纳大部分参数(简单的一个)。另一方面,我们可以使用默认参数,但在任何情况下,这都无助于处理多行(大量)函数声明。有什么想法吗

如果我们再深入一点,查看
androidx.compose.*.**
(材料即)包,我们会发现许多组件实际上有许多用于状态提升的参数(lambda)。因此,我认为这是一种常见的方法。 我们可以使用
TextField
composable,这是我所说的一个很好的例子:

@Composable
fun TextField(
    value: String,
    onValueChange: (String) -> Unit,
    modifier: Modifier = Modifier,
    textStyle: TextStyle = AmbientTextStyle.current,
    label: @Composable (() -> Unit)? = null,
    placeholder: @Composable (() -> Unit)? = null,
    leadingIcon: @Composable (() -> Unit)? = null,
    trailingIcon: @Composable (() -> Unit)? = null,
    isErrorValue: Boolean = false,
    visualTransformation: VisualTransformation = VisualTransformation.None,
    keyboardType: KeyboardType = KeyboardType.Text,
    imeAction: ImeAction = ImeAction.Unspecified,
    onImeActionPerformed: (ImeAction, SoftwareKeyboardController?) -> Unit = { _, _ -> },
    onTextInputStarted: (SoftwareKeyboardController) -> Unit = {},
    interactionState: InteractionState = remember { InteractionState() },
    activeColor: Color = MaterialTheme.colors.primary,
    inactiveColor: Color = MaterialTheme.colors.onSurface,
    errorColor: Color = MaterialTheme.colors.error,
    backgroundColor: Color = MaterialTheme.colors.onSurface.copy(alpha = ContainerAlpha),
    shape: Shape =
        MaterialTheme.shapes.small.copy(bottomLeft = ZeroCornerSize, bottomRight = ZeroCornerSize)
)
当然,它还包含许多配置参数和。 尽管如此,问题依然存在。 当这种情况发生时,我几乎没有选择:

  • 一个复杂的UI,可与许多可能的用户事件组合,即
    TextField
  • 一个复杂的UI结构/层次结构,包含多个相互包装的组件,需要从下到上提升事件/用户输入。嗯,提升可以通过每一个级别提高参数级别(lambda)
  • 您的案例在这里
顺便说一句,我并不是说这是错误的,也不是说它有什么不好的地方,只是想找到一个舒适的方式


p.p.S.我知道这一切都是为了取舍。

我个人认为,将参数构造成
数据类
可以为用户和提供商提供更高的可读性

例如:
activeColor
inactiveColor
errorColor
backgroundColor
。可以搬到一个

data class TextFieldColors(
    val activeColor: Color, 
    val inactiveColor: Color, 
    val errorColor: Color, 
    val backgroundColor: Color)
(请原谅此处的命名)

您可以对图标、占位符执行类似的操作,并且基本上以对提供者和使用者都有意义的方式构造参数


此外,我相信在扩展现有组件时,重用这些已经创建的参数类会有所帮助。

我建议研究一下这个线程。谢谢,但问题是关于状态提升的,所以我指的是lambda params。是的,我会为它做一些类似的事情,比如
数据类TextFieldState(value:String,onValueChanged:(String)->Unit)
实际上,即使在问题内部也提到了这种方法。无论如何,一个有效的,谢谢。