【问题标题】:How to hoist multiple states?如何提升多个状态?
【发布时间】:2020-11-02 22:01:17
【问题描述】:

当我们谈论Compose时,我们肯定会面对state hoisting的做法。这很舒服,不需要火箭科学知识。但是这里会出现一堆其他问题和另一堆可能的解决方案。这就是通过 fun 声明传递的众多参数。回到过去的美好时光,我们可以让自己拥有一个容器,它可以容纳几乎所有的参数(简单的一个)。另一方面,我们可以有默认参数,但无论如何这无助于处理多行(huge number)函数声明。这里有什么想法吗?

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

@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)
)

当然,它还包含很多配置参数和composable slots。 尽管如此,问题仍然存在。 当这种情况发生时,我几乎没有选择:

  • 一个复杂的用户界面,可与许多可能的用户事件组合,即TextField
  • 一个复杂的 UI 结构/层次结构,具有多个相互包装的可组合项,并且需要将事件/用户输入从底部提升到顶部。好吧,提升可以通过每个级别增加参数(lambdas)的级别。
  • Your case here

附:我并不是说它是错误的或者它有什么不好,只是试图找到一种舒适的方式。

附言我知道这一切都是为了权衡取舍。

【问题讨论】:

标签: android android-view android-jetpack-compose


【解决方案1】:

我个人认为将参数结构化为data classes 可以为消费者和提供者提供更多的可读性。

例如:activeColorinactiveColorerrorColorbackgroundColor。可以移动到一个

data class TextFieldColors(
    val activeColor: Color, 
    val inactiveColor: Color, 
    val errorColor: Color, 
    val backgroundColor: Color)

(请原谅这里的命名)

您可以对图标、占位符进行类似的操作,并且基本上以对提供者和消费者都有意义的方式构建参数。

此外,我相信重用这些已创建的参数类有助于扩展现有组件。

【讨论】:

  • 谢谢,但问题是关于状态提升,所以我的意思是 lambda 参数。
  • 是的,我会为它做类似的事情,比如data class TextFieldState(value: String, onValueChanged: (String) -> Unit)
  • 实际上,即使在问题中也提到了这种方法。无论如何,一个有效的,谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-02-06
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 2018-03-17
相关资源
最近更新 更多