【发布时间】: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