I am trying to convert a view based screen to Compose and while what I need should be very basic, somehow I can’t get this to work. The use case at hand is a serial task where one step follows the other and the UI should reflect progress. But I seem to miss something fundamental because none of my Text() will update. Below is a simplified example of what I got:
override fun onCreate(savedInstanceState: Bundle?) {
…
setContent {
Import()
}
}
@Composable
fun Import() {
var step1 by remember { mutableStateOf("") }
var step2 by remember { mutableStateOf("") }
Column() {
Text(text = step1)
Text(text = step2)
}
}
step1 = "Open ZIP file"
val zipIn: ZipInputStream = openZIPFile()
step1 = "✓ $step1"
step2 = "Extract files"
val count = extractFiles()
step2 = "✓ $step2"
…
}
If I set the initial text in the remember line, like this
var step1 by remember { mutableStateOf("Open ZIP file") }
the text will show, but also never gets updated.
I also tried to move the logic part into a separate function which gets executed right after setContent() but then the step1/step2 aren’t available for me to update.
#######
Edit:
Well, as expected this turned out to be really easy. I have to break this one
var step1 by remember { mutableStateOf("Open ZIP file") }
into 2 statements:
var step1String = mutableStateOf("Open ZIP file")
With step1String as a class wide variable so I can change it from other functions. In the Import() composable function al I need is this:
var step1 by remember { step1String }
Have to say Compose is growing on me… :-)
I’ve done something very similar recently actually.
I don’t know if it’s a good practice but I ended using DataStore and StateFlow as a signalling mechanism between ViewModel and the zip operation.