Kotlin闭包捕获值疑问:Compose DropdownMenu参数差异与Unit作用
DropdownMenu(expanded = ddMenu.value, onDismissRequest = { ddMenu.value = false }) { DropdownMenuItem(text = { Text("Çıkış") }, onClick = {}) }
关于赋值语句的返回值
Kotlin里的赋值表达式确实会返回被赋予的值,比如ddMenu.value = false这个语句本身返回的是false(Boolean类型)。但这里的关键是lambda的预期返回类型:onDismissRequest要求的是一个() -> Unit类型的lambda,也就是无参、返回Unit的函数。
当你把{ ddMenu.value = false }传给它时,Kotlin编译器会自动适配:因为预期返回Unit,即使最后一行是返回Boolean的赋值语句,编译器会忽略这个返回值,把整个lambda的返回值处理成Unit。你也可以手动写成{ ddMenu.value = false; Unit },但完全没必要,编译器会帮你做这个转换。
为什么expanded和onDismissRequest的写法不同
expanded参数需要的是一个Boolean值,它用来控制菜单当前是否展开,所以直接传ddMenu.value这个当前的布尔状态就行,不需要闭包——因为它是一个状态值,不是一个要执行的动作。onDismissRequest参数需要的是一个回调函数,当菜单需要被关闭时(比如点击外部),系统会调用这个函数。我们需要在这个回调里修改状态(把ddMenu.value设为false),所以必须用闭包来包裹这个赋值操作,这样它才会在回调触发时执行,而不是一开始就执行。
为什么用Unit
这和性能无关,完全是语义层面的设计。onDismissRequest的作用是执行一个副作用操作(修改状态),而不是返回某个有用的值。Unit在Kotlin里就代表“没有返回值”,或者说“返回一个无意义的占位值”,用来明确这个回调不需要返回任何有价值的内容,只需要完成动作即可。
内容的提问来源于stack exchange,提问作者GAIUS12100
相关产品推荐
相关产品推荐

