我有两个活动:ActivityOne.kt
和ActivityTwo.kt
.它们都使用Jetpack Compose来显示UI.在第一个例子中,一个项目(比如Text
)必须用变量showtText
表示为true
,当它为false时隐藏.我通过以下方式实现这一点:
@Composable
fun MyUI(){
AnimatedVisibility(visible = viewModel.showText) {
Text("Some text")
}
}
我的变量showText
在ViewModel中定义,例如:
val showText by mutableStateOf(false)
这样,当ActivityOne.kt
可见时,只要我在ViewModel中更改showText
的值,它就会出现或消失.我想要实现以下目标:
- 从
ActivityOne.kt
,用户可以导航到ActivityTwo.kt
(第一个在后台运行,不会从堆栈中清除). - 这里有一个
Switch
可以切换showText
的值. - 当用户按"后退"时,
ActivityTwo.kt
调用finish()
,它消失,再次显示ActivityOne.kt
(它在堆栈中). - 如果用户在
ActivityTwo.kt
中切换了showText
值,则文本应自动隐藏或显示,因为showText
的状态已更改.
问题是,尽管showText
的值确实发生了变化,但ActivityOne.kt
中的UI没有响应这些变化.我已经判断过ActivityOne.kt
的UI在ActivityTwo.kt
完成后没有重新编译,因为它不记得之前的状态showText
.
我怎样才能做到呢?提前感谢!
EDIT 1
ActivityOne.kt:
class ActivityOne : ComponentActivity() {
private lateinit var vm: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val vmFactory = MainViewModelFactory()
vm = ViewModelProvider(this, vmFactory).get(MainViewModel::class.java)
setContent {
MyTheme {
Surface {
MyUI()
}
}
}
}
@Composable
fun MyUI() {
AnimatedVisibility(visible = myPrefs.showText) {
Text("Some text")
}
}
}
MainViewModel.kt:
class MainViewModel : ViewModel() {
companion object {
val myPrefs by mutableStateOf( AppPrefs() )
}
}
ActivityTwo.kt:
class ActivityTwo : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyTheme {
Surface {
MyUI2()
}
}
}
}
@Composable
fun MyUI2() {
val showText = remember {
mutableStateOf(MainViewModel.myPrefs.showText)
}
Switch(
checked = showText.value,
onCheckedChange = {
showText.value = it
MainViewModel.myPrefs.showText = it
}
)
}
}
AppPrefs.kt:
class AppPrefs {
var showText: Boolean = false
}