Neal Sanche
02/26/2021, 3:36 PMjim
02/26/2021, 4:02 PMNeal Sanche
02/26/2021, 4:16 PMNeal Sanche
02/26/2021, 4:18 PMScaffold(
content = { padding ->
Column(horizontalAlignment = Alignment.End, modifier = Modifier.padding(padding)) {
ProcessedImage()
var sliderValue by rememberSaveable { mutableStateOf(75.0f) }
Slider(
valueRange = 8f..100f,
steps = 12,
value = sliderValue,
onValueChange = {
sliderValue = it
onSliderValueChanged(it)
})
PreviewRow(backCameraToggled, onImage)
}
}
The PreviewRow here, was being recomposed every time the slider moved, so I decided to refactor the slider into its own Composable function, which ended up looking like:
@Composable
private fun PixelSizeSlider(onSliderValueChanged: (Float) -> Unit) {
var sliderValue by rememberSaveable { mutableStateOf(75.0f) }
Slider(
valueRange = 8f..100f,
steps = 12,
value = sliderValue,
onValueChange = {
sliderValue = it
onSliderValueChanged(it)
})
}
And which in turn made the scaffold content change to:
content = { padding ->
Column(horizontalAlignment = Alignment.End, modifier = Modifier.padding(padding)) {
ProcessedImage()
PixelSizeSlider(onSliderValueChanged)
PreviewRow(backCameraToggled, onImage)
}
}
After doing this, PreviewRow
was no longer getting recomposed whenever the slider was modified. When I look at the code, I can't figure out why this was happening. PreviewRow
doesn't depend on the sliderValue
so shouldn't it be skipped when being composed? Some may ask how I'm testing this. I'm using the debugger and putting debug logging breakpoints into my composables to see which ones get hit, not very scientific, but I would hope that it would work correctly.Rick Regan
02/26/2021, 5:30 PMjim
02/26/2021, 6:17 PMRick Regan
02/26/2021, 7:04 PMjim
02/26/2021, 7:07 PMRick Regan
02/26/2021, 7:08 PMRick Regan
02/26/2021, 7:11 PMColton Idle
02/26/2021, 7:18 PMhow much someone wants to lean into immutable vs. observable-mutatable data@jim This is something that I still need to get better about. I originally thought with compose that my approach of having everything be immutable would work really well, but the two approaches available are interesting. My team lead pushed really hard on immutability a year or so ago and so I'm in this constant mode of trying to make everything immutable.