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… :-)
This may be a long shot, but it's what I do, so it might be an option: Set up a crypto gateway like CipherMail which will automatically decrypt inbound email and sign/encrypt outbound. The result is that your Thunderbird will never get to see an encrypted email, decryption is handled transparently before it hit's your inbox. Obviously, if you don't trust your email provider, this is not an option.
This isn't simple and hence not for everyone, also comes with dependencies on your email provider, but it works flawless for me ever since I set it up. I run my own email server, hence adding in CipherMail wasn't a big deal.