Ali*_*ris 45 android kotlin android-jetpack android-jetpack-compose
我想以这样的方式应用修饰符:如果提供了宽度,则应该使用提供的宽度,否则使用可用的最大宽度。
我按以下方式应用修改器,但结果不符合预期。视图宽度变得混乱。在此请求指导。
val myModifier = Modifier.padding(
start = 4.dp, end = 4.dp, top = 8.dp, bottom = 8.dp
)
if (viewWidth == null)
myModifier.then(Modifier.fillParentMaxWidth(1f))
else
myModifier.then(Modifier.width(viewWidth))
myModifier.then(
Modifier.height(viewHeight ?: 100.dp)
.clickable(onClick = { listener.onItemClick(item) })
)
Run Code Online (Sandbox Code Playgroud)
Oli*_*etz 69
您可以通过扩展函数创建条件修饰符:
fun Modifier.conditional(condition : Boolean, modifier : Modifier.() -> Modifier) : Modifier {
return if (condition) {
then(modifier(Modifier))
} else {
this
}
}
Run Code Online (Sandbox Code Playgroud)
这使您可以将修饰符链接到conditional
块中,如下所示:
val applySpecialBackground : Boolean = [...]
Column(
modifier = Modifier
.fillMaxWidth()
.conditional(applySpecialBackground) {
background(Color.Red)
}
.padding(16.dp)
) { [...] }
Run Code Online (Sandbox Code Playgroud)
仅当条件为 时,它才会应用条件修饰符true
。
如果您需要该情况的修饰符,false
只需链接第二个否定条件即可。
val applySpecialBackground : Boolean = [...]
Column(
modifier = Modifier
.fillMaxWidth()
.conditional(applySpecialBackground) {
background(Color.Red)
}
.conditional(!applySpecialBackground) {
background(Color.Blue)
}
.padding(16.dp)
) { [...] }
Run Code Online (Sandbox Code Playgroud)
如果您感觉超级喜欢,您还可以向扩展函数添加可选的负案例。
fun Modifier.conditional(
condition: Boolean,
ifTrue: Modifier.() -> Modifier,
ifFalse: (Modifier.() -> Modifier)? = null
): Modifier {
return if (condition) {
then(ifTrue(Modifier))
} else if (ifFalse != null) {
then(ifFalse(Modifier))
} else {
this
}
}
Run Code Online (Sandbox Code Playgroud)
如果您的条件为假,这将为您提供一个单独的参数:
val applySpecialBackground : Boolean = [...]
Column(
modifier = Modifier
.fillMaxWidth()
.conditional(
applySpecialBackground,
ifTrue = { background(Color.Red) },
ifFalse = { background(Color.Blue) }
)
.padding(16.dp)
) { [...] }
Run Code Online (Sandbox Code Playgroud)
非常感谢 mtotschnig 指出了之前实现中的一个严重错误!
Avi*_*kar 30
Modifier
有一个then
将当前修饰符与另一个修饰符连接起来的函数。该then
函数返回一个您尚未使用过的新修饰符。myModifier
您必须使用返回的修饰符重新初始化变量。
检查下面的代码:
var myModifier = Modifier.padding(
start = 4.dp, end = 4.dp, top = 8.dp, bottom = 8.dp
)
if (viewWidth == null)
myModifier = myModifier.then(Modifier.fillParentMaxWidth(1f))
else
myModifier = myModifier.then(Modifier.width(viewWidth))
myModifier = myModifier.then(
Modifier
.height(viewHeight ?: 100.dp)
.clickable(onClick = { listener.onItemClick(item) })
)
Run Code Online (Sandbox Code Playgroud)
小智 19
您还可以Modifier.then
以更紧凑的方式使用:
val modifier = Modifier
.padding(start = 4.dp, end = 4.dp, top = 8.dp, bottom = 8.dp)
.then(if(viewWidth == null) Modifier.fillMaxWidth(1f) else Modifier.width(viewWidth))
.height(viewHeight ?: 100.dp)
.clickable(onClick = { listener.onItemClick(item) })
Run Code Online (Sandbox Code Playgroud)
请参阅:https://jetc.dev/slack/2020-12-13-conditional-modifiers.html
以上所有答案都足够好,但我想补充一分钱。我发现这个片段更具可读性和简洁性。
ClickableText(
modifier = Modifier
.let {
if (selectedPosition == index) {
return@let it
.background(
Green200,
shape = RoundedCornerShape(12.dp)
)
}
it
}
.padding(horizontal = 12.dp, vertical = 4.dp),
text = AnnotatedString(categories[index]),
style = TextStyle(
fontSize = 14.sp,
textAlign = TextAlign.Center
),
onClick = {
selectedPosition = index
}
)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
19206 次 |
最近记录: |