John Dior
09/04/2023, 2:43 AMvar rowHolder by remember { mutableStateOf(StateWrapper(initialState)) }
State wrapper is defined as
data class StateWrapper<T>(
val state: T
)
and in this case the initialState is
initialState: List<TableRow>
I have a button that looks like this
Button( onClick = {
active = false
//state.value.add(TableRow(Song("sup", 0),false))
rowHolder = rowHolder.copy(state = listOf())
val rows: MutableList<TableRow> = mutableListOf()
for (i in 0 until 50) {
rows.add(
TableRow(
Song(
"Song $i",
i.toString(),
Random.nextInt(3).let {
STATUS.values()[it]
}
)
)
)
}
rowHolder = StateWrapper(rows)
}) {
Text("POPUL8")
}
The code looks something like this
@Composable fun render() {
// define rowHolder
// button code
renderComponent(rowHolder)
}
@Composable fun renderComponent(rowHolder: StateWrapper) {
var ret by remember {mutableStateOf(rowHolder)}
// make a bunch of cards.
}
clicking the button does nothing...肖志康
09/04/2023, 2:53 AMrenderComponent
, creating and remembering an inside mutableState instance of StateWrapper?John Dior
09/04/2023, 3:19 AM肖志康
09/04/2023, 3:24 AMrenderComponent
and use the parameter rowHolder directly. And check https://developer.android.com/jetpack/compose/state#retrigger-remember for more infomations.John Dior
09/04/2023, 3:32 AMascii
09/04/2023, 10:17 AMrender
, so why are you re-remembering it in renderComponent
?
StateWrapper is just a data class, so you don't need to remember or mutate it again. Use it directly.ascii
09/04/2023, 10:23 AMrender
, renderComponent
will recompose with the correct mutated value, but then as explained above, you're re-remembering only the initial value (var ret by remember {mutableStateOf(rowHolder)}
).
The link above explains why, and how you can re-trigger by passing in keys (if key changes, init will run again).
In any case, I'm not sure why you're creating another mutable state of the same thing in a child composable.ascii
09/04/2023, 10:28 AM@Composable fun render() {
var rowHolder by remember { mutableStateOf(StateWrapper(initialState)) }
// button code
renderComponent(rowHolder, { rowHolder = it })
}
@Composable fun renderComponent(rowHolder: StateWrapper, onRowHolderChange: (StateWrapper) -> Unit) {
// use rowHolder directly
// if changed, for example in a button or in response to another event, call `onRowHolderChange` with the mutated value
}
John Dior
09/05/2023, 2:57 AM