我正在构建一个可组合的,比如:
@Composable
fun BottomSectionWrapper(
content: @Composable () -> Unit,
bottomSection: @Composable () -> Unit,
)
现在我想知道参数bottomSection
是否为空,以便相应地调整布局。这可能吗?
我不会再进一步定义“空”了;我会采取技术上可行的方法
- 一个空的lambda {}
- 一个不会发出composable的lambda:{ if(false)Text(“Test”)}
- 一个大小为零的lambda:{ Box(Modifier.size(0.dp))}
让我解释一下我的典型用例:我使用这个 Package 器将按钮附加到屏幕的下端。如果有一个按钮,我想添加一个淡入淡出。
我试过什么?
我试着把lambda设置为可空的--但编译不了
BottomSectionWrapper(
content = { /* ... */ },
bottomSection = if(showDeleteButton){
Button { Text("Delete") }
} else null
)
另外:直觉上,我会这样写(这不会被简单的null检查检测到):
BottomSectionWrapper(
content = { /* ... */ },
bottomSection = {
if (showDeleteButton) {
Button { Text("Delete") }
}
}
)
1条答案
按热度按时间t5zmwmid1#
如果你想拥有可空的内容,你需要将声明设置为
你可以像这个演示一样使用它
如果您希望检测Composable是否为空或具有0.dp大小或任何大小,您可以使用
Layout
与不同的方法,尺寸设置和放置选项。第二个带有
Modifier.layoutId
的字符串用于默认的可组合字符串,如TextField
、Tab
使用这个
Layout
,你可以通过检查Placeable是否为null来检测它们是否为空,这意味着传递了空的lambda,如果不是null,你可以检查它的大小。如果你检查println,你可以看到,在每种情况下,你将能够看到什么是null或不是。你也可以得到Placable尺寸。
另一个选项是像Textfield在第495行中那样创建这个布局。
https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt;l=495?q=TextField&ss=androidx%2Fplatform%2Fframeworks%2Fsupport
但是使用这种方法,您将无法检查是否传递了空lambda,因为它在非null时被放置在Box中。但是,这种方法经常使用,因为您可以通过ID而不是检查列表来检查和比较内容。
用途与其他布局相同。