Nthily
08/04/2023, 5:09 AM@Composable
functions with many lambda parameter callbacks? would creating a state holder be a better approach? š¤
@Composable
fun StatusDetailContent(
status: StatusUiData,
descendants: ImmutableList<StatusUiData>,
loading: Boolean,
modifier: Modifier = Modifier,
favouriteStatus: (String) -> Unit,
unfavouriteStatus: (String) -> Unit,
navigateToDetail: (Status) -> Unit,
navigateToProfile: (Account) -> Unit,
navigateToMedia: (List<Attachment>, Int) -> Unit,
) {
LazyColumn(modifier = modifier) {
item {
StatusDetailCard(
status = status,
favouriteStatus = { favouriteStatus(status.actionableId) },
unfavouriteStatus = { unfavouriteStatus(status.actionableId) },
navigateToDetail = { navigateToDetail(status.actionable) },
navigateToMedia = navigateToMedia,
navigateToProfile = navigateToProfile,
contentTextStyle = TextStyle(
fontSize = 16.sp,
color = AppTheme.colors.primaryContent
),
)
}
}
Aldi Kitta
08/04/2023, 5:12 AMcurioustechizen
08/04/2023, 5:30 AMsealed interface StatusDetailAction {
data class OnFavoriteStatus(val actionableId: String): StatusDetailAction
data class OnUnfavoriteStatus(val actionableId: String): StatusDetailAction
data class OnNavigateToProfile(val account: Account): StatusDetailAction
// You get the idea
}
And then
@Composable
fun StatusDetailContent(
status: StatusUiData,
actionHandler: (StatusDetailAction) -> Unit,
) {
LazyColumn {
item {
StatusDetailCard(
status = status,
onFavoriteStatus = { actionHandler(StatusDetailAction.OnFavoriteStatus(status.actionableId)) },
// and so on
)
}
}
}
curioustechizen
08/04/2023, 5:30 AMNthily
08/04/2023, 5:34 AMStylianos Gakis
08/04/2023, 6:08 AMcurioustechizen
08/04/2023, 6:28 AM@Preview
@Composable
fun StatusDetailPreview() {
StatusDetailContent(status = StatusUiData(), actionHandler = {})
}
versus this
@Preview
@Composable
fun StatusDetailPreview() {
StatusDetailContent(
status = StatusUiData(),
favouriteStatus = {},
unfavouriteStatus = {},
navigateToDetail = {},
navigateToProfile = {},
navigateToMedia = {},
)
}
curioustechizen
08/04/2023, 6:30 AMStylianos Gakis
08/04/2023, 6:32 AM, {}
or with the name as you showed above is definitely not the most fun experience in the world.
But itād be an even worse experience if I had to come up with a name and create a new sealed class for every single composable that takes in 3+ lambdas in the entire codebase.
So yeah, strike the balance you feel like is best for you šcurioustechizen
08/04/2023, 6:42 AM<S, A>
where S is a FooUiState data class and A is a sealed interface for actions - so this makes sense in that situation. For other composables that are not at the top-level, it is indeed a balance that you need to strike.