【发布时间】:2021-12-28 06:07:26
【问题描述】:
代码A来自官方样本project的主分支。
项目中有枚举类RallyScreen的三个子类Overview、Accounts和Bills。
有一个函数fun content(onScreenChange: (String) -> Unit) { body(onScreenChange) }接受RallyScreen类中的参数onScreenChange : (String) -> Unit。
虽然语句是enum class RallyScreen(val body: @Composable ((String) -> Unit) -> Unit) {..},但Overview类中的body = { OverviewBody() }、Accounts类中的body = { AccountsBody(UserData.accounts) }和Bills类中的body = { BillsBody(UserData.bills) }不需要通过参数(String) -> Unit),为什么App启动时Kotlin可以运行良好,通过Tab很好导航fun content(onScreenChange: (String) -> Unit) { body(onScreenChange)}?
代码 A
@Composable
fun RallyApp() {
RallyTheme {
val allScreens = RallyScreen.values().toList()
var currentScreen by rememberSaveable { mutableStateOf(RallyScreen.Overview) }
Scaffold(
topBar = {
RallyTabRow(
allScreens = allScreens,
onTabSelected = { screen -> currentScreen = screen },
currentScreen = currentScreen
)
}
) { innerPadding ->
Box(Modifier.padding(innerPadding)) {
currentScreen.content(
onScreenChange = { screen ->
currentScreen = RallyScreen.valueOf(screen)
}
)
}
}
}
}
enum class RallyScreen(
val icon: ImageVector,
val body: @Composable ((String) -> Unit) -> Unit
) {
Overview(
icon = Icons.Filled.PieChart,
body = { OverviewBody() }
),
Accounts(
icon = Icons.Filled.AttachMoney,
body = { AccountsBody(UserData.accounts) }
),
Bills(
icon = Icons.Filled.MoneyOff,
body = { BillsBody(UserData.bills) }
);
@Composable
fun content(onScreenChange: (String) -> Unit) {
body(onScreenChange)
}
}
@Composable
fun OverviewBody(
onClickSeeAllAccounts: () -> Unit = {},
onClickSeeAllBills: () -> Unit = {},
onAccountClick: (String) -> Unit = {},
) {
...
}
@Composable
fun AccountsBody(
accounts: List<Account>,
onAccountClick: (String) -> Unit = {},
) {
...
}
@Composable
fun BillsBody(bills: List<Bill>) {
...
}
添加内容:
致加布里埃尔·皮萨罗:谢谢!
clas Overview的说法,body不需要任何参数,它使用默认值,onScreenChange参数是如何传递的?
Overview(
icon = Icons.Filled.PieChart,
body = { OverviewBody() } //It needn't any parameter
)
@Composable
fun content(onScreenChange: (String) -> Unit) {
body(onScreenChange)
}
此外,当我为乐趣添加两个默认参数OverviewBody(...) 时,该应用程序可以正常运行。
@Composable
fun OverviewBody(
onClickSeeAllAccounts: () -> Unit = {},
onClickSeeAllBills: () -> Unit = {},
a1: (String) -> Unit = {}, // I add
onAccountClick: (String) -> Unit = {},
a2: (String) -> Unit = {}, //I add
) {
...
}
【问题讨论】:
标签: kotlin android-jetpack-compose