Håkon Pettersen
10/11/2023, 12:37 PMListOfItemInCard
in GenericDetailSettingRows
is recomposed. I checked the hash codes of each GenericDetailRow
, and they remained the same through every recomposition. Any help would be much appreciated.@Composable
fun GenericDetailScreen(
settingRows: List<GenericDetailRow.Settings>,
onRowSelected: (GenericDetailRow) -> Unit,
) {
Scaffold { paddingValues ->
Column(
modifier = Modifier
.padding(paddingValues)
.padding(horizontal = dimensionResource(id = R.dimen.content_padding))
.verticalScroll(rememberScrollState()),
verticalArrangement = Arrangement.spacedBy(dimensionResource(id = R.dimen.half_content_padding)),
) {
GenericDetailSettingRows(
settingRows = settingRows,
onRowSelected = onRowSelected,
)
}
}
}
Child-composable:
@Composable
fun GenericDetailSettingRows(
settingRows: List<GenericDetailRow.Settings>,
onRowSelected: (GenericDetailRow.Settings) -> Unit,
) {
if (settingRows.isNotEmpty()) {
HeaderText(text = { it.getString(R.string.settings) })
ListOfItemInCard(
items = settingRows,
withDividers = true,
) { row ->
when (row) {
GenericDetailRow.Settings.AlarmSettings -> {
RowImageTextArrow(
leadingIconRes = R.drawable.ic_alarm_24dp,
text = { it.getString(R.string.generic_detail_page_smart_alarm_settings) },
onClick = { onRowSelected(row) },
)
}
...
}
}
}
}
Content set from fragment:
return ComposeView(requireContext()).apply {
setContent {
val state = viewModel.state.collectAsStateWithLifecycle(initialValue = GenericDetailState())
EvaTheme {
GenericDetailScreen(
settingRows = state.value.settingRows,
onRowSelected = viewModel::onRowSelected,
)
}
}
}
View state (A lot of the state is unused attempting to solve this "bug"):
data class GenericDetailState(
val name: String = "",
val icon: String = "",
val settingRows: List<GenericDetailRow.Settings> = emptyList(),
...
)
GenericDetailRow:
sealed interface GenericDetailRow {
// Used to ensure consistent ordering of rows in the view.
val priority: Int
sealed class Settings : GenericDetailRow {
object GenericSettings : Settings() {
override val priority = 1
}
...
Lib-version:
compose = "2023.06.00"
compose-compiler = "1.5.1"
onRowSelected: (GenericDetailRow.Settings) -> Unit
for some reason. If I replace RowImageTextArrow
with a standard Button and leave the onClick-lambda empty, it skips recomposition.Zach Klippenstein (he/him) [MOD]
10/11/2023, 7:47 PMHåkon Pettersen
10/12/2023, 6:48 AM@Stable
fun interface RowClickListener {
fun selected()
}
Zach Klippenstein (he/him) [MOD]
10/12/2023, 1:49 PM{ viewModel.onRowSelected() }
instead of a method reference, would that make the lambda stable?