Se7eN
02/21/2021, 6:29 PMCanvasElement
and two subclasses CanvasElement.Text
and CanvasElement.Image
. Then I have a list like val elements = mutableStateListOf<CanvasElement>()
.
How can I recompose my composables when I change an element in my list to the same element but a different property which is only present in CanvasElement.Text
and CanvasElement.Image
and not in CanvasElement
.
Something like this:
sealed class CanvasElement(open val id: String, open val position: Offset) {
data class Text(val size: Float, override val position: Offset, open val id: String): CanvasElement(id, position)
data class Image(val size: IntSize, override val position: Offset, open val id: String): CanvasElement(id, position)
}
val elements = mutableStateListOf<CanvasElement>()
fun modifyElement(id: String, newElement) {
// find index of id
...
elements[index] = newElement
}
Then if I modify one of my text elements by changing its size, I want my Text composable to recompose:
modifyElement((myElement as CanvasElement.Text).copy(size = newSize))
@Composable
fun Element(element: CanvasElement) {
when(element) {
is CanvasElement.Text -> Text("text", size = element.size) // does not recompose when size changes
is CanvasElement.Image -> ... // does not recompose when size changes
}
}
But the recomposition isn't happening and the text size stays the same. Is it not possible? Do I have to keep separate lists for CanvasElement.Text
and CanvasElement.Image
?Vivek Sharma
02/22/2021, 7:00 PMelements
is mutableState of CanvasElement
list, so changes would occur if we change the list, I think you need to have a new list with prev elements unchanged and the new element changed in that no?
that's what you are doing in modify fun,
did you debug that element list is changing or notSe7eN
02/23/2021, 1:39 PMmodifyElement
and the list is changing but the composables don't recompose. Anyways I've migrated CanvasElement
to hold `MutableState`s and that seems to work.