The Code A is from the official Sample project here.
1: I think I can wrap text.isNotBlank()
withremember
, so I think Code B is good, right?
BTW, I know the system will re-calculate when the text
( val (text, setText) = remember { mutableStateOf("") }
) is changed. So
2: In Code B, val (icon, setIcon) = remember { mutableStateOf(TodoIcon.Default)}
and val iconsVisible = remember {text.isNotBlank() }
will be re-launched when the text is changed (val (text, setText) = remember { mutableStateOf("") }
) , right?
Code A
@Composable
fun TodoItemInput(onItemComplete: (TodoItem) -> Unit) {
val (text, setText) = remember { mutableStateOf("") }
val (icon, setIcon) = remember { mutableStateOf(TodoIcon.Default)}
val iconsVisible = text.isNotBlank()
Column {
Row( /* ... */ ) {
/* ... */
}
if (iconsVisible) {
AnimatedIconRow(icon, setIcon, Modifier.padding(top = 8.dp))
} else {
Spacer(modifier = Modifier.height(16.dp))
}
}
}
Code B
@Composable
fun TodoItemInput(onItemComplete: (TodoItem) -> Unit) {
val (text, setText) = remember { mutableStateOf("") }
val (icon, setIcon) = remember { mutableStateOf(TodoIcon.Default)}
val iconsVisible = remember {text.isNotBlank() } //I add remember
Column {
...
}
}
CodePudding user response:
If you use remember
as in Code B, iconsVisible
will be calculated only once and the same value will be used across all recompositions and not get updates when text
changes, which is not what we want here.
If you want to use remember
here, you should pass text
as a key to it, remember(text) { text.isNotBlank() }
. But as this is not a time consuming calculation, you can just skip the remember
block and use it as in Code A. The .isNotBlank()
function will be invoked in every recomposition but that doesn't matter much here.