如何不使用Lambda向Scaffold传递Composable函数?
问题说明
原代码示例
Scaffold( bottomBar = { SootheBottomNavigation() }, content = { padding -> HomeScreen(Modifier.padding(padding)) } ) @Composable fun HomeScreen(modifier: Modifier = Modifier) { }
Scaffold的content参数定义(中文翻译)
content: @Composable (PaddingValues) -> Unit
问题
如何不使用Lambda将content对应的Composable传递给Scaffold?
解决方案
方法一:定义具名Composable函数
直接创建一个与content参数签名完全匹配的具名Composable函数,然后传递函数引用即可:
// 定义符合参数要求的Composable函数 @Composable fun HomeScreenContent(padding: PaddingValues) { HomeScreen(Modifier.padding(padding)) } // 传递函数引用给Scaffold的content参数 Scaffold( bottomBar = { SootheBottomNavigation() }, content = ::HomeScreenContent )
方法二:使用Composable函数变量
如果需要临时封装逻辑,可以先将逻辑赋值给一个类型匹配的函数变量,再传递该变量:
// 定义类型匹配的Composable函数变量 val homeContent: @Composable (PaddingValues) -> Unit = { padding -> HomeScreen(Modifier.padding(padding)) } // 传递变量给content参数 Scaffold( bottomBar = { SootheBottomNavigation() }, content = homeContent )
原理说明
content参数接受的是一个带PaddingValues参数的@Composable类型函数,Lambda只是匿名函数的简写形式。只要提供的函数满足:
- 被
@Composable注解标记 - 接收一个
PaddingValues类型参数 - 返回值为
Unit
就可以直接替代Lambda传递给content参数。
内容的提问来源于stack exchange,提问作者sjso
相关产品推荐
相关产品推荐

