class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
HelloScreen(helloViewModel);
}
}
//1.耦合度太高
// @Composable
// fun HelloContent() {//有状态可组合项
// Column(Modifier.padding(10.dp)) {
// var name by remember { mutableStateOf("") }//记住状态值 MutableState可观察类型 LiveData Flow RxJava2
// Text(text = name)//初始值是空的
// OutlinedTextField(value = name,//初始值是空的 把name值赋值给value
// onValueChange = { name = it })//输入值后,获取初始值(it) 然后赋值给name
// }
// }
//2.提升出状态
// @Composable
// fun HelloScreen() {
// var names by remember { mutableStateOf("") }//记住状态值 MutableState可观察类型 LiveData Flow RxJava2
// HelloContent(names, onNameChange ={names = it} )//提升出状态
// }
// @Composable
// fun HelloContent(names:String,onNameChange:(String) ->Unit){
// Column(modifier=Modifier.padding(16.dp)) {
// Text(text = names)
// OutlinedTextField(value = names, onValueChange = onNameChange)
// }
// }
//3.viewmodel方式
//依赖注入
implementation "androidx.compose.runtime:runtime-livedata:$compose_version"
HelloViewModel类
class HelloViewModel:ViewModel() {
private val _name = MutableLiveData("")
val name: LiveData<String> = _name
fun onNameChange(newName: String) {
_name.value = newName
}
}
MainActivity类
private val helloViewModel:HelloViewModel by viewModels()//初始化viewmodel,否则旋转屏幕无法保存状态
@Composable
fun HelloScreen(helloViewModel: HelloViewModel) {
val name: String by helloViewModel.name.observeAsState("")//name的值等价于helloViewModel.name 初始化为空
HelloContent(name, onNameChange ={ helloViewModel.onNameChange(it) } )//提升出状态
}
@Composable
fun HelloContent(names:String,onNameChange:(String) ->Unit){
Column(modifier=Modifier.padding(16.dp)) {
Text(text = names)
OutlinedTextField(value = names, onValueChange = onNameChange)
}
}
android compose管理状态
最新推荐文章于 2025-11-21 09:00:22 发布
这篇博客探讨了在Android Compose中如何通过不同方式管理状态,从耦合度过高的直接状态管理,到提升状态并使用函数参数传递,最后采用ViewModel实现更好的状态保存和解耦。文中详细介绍了HelloViewModel的实现以及如何在MainActivity中结合viewModels()函数来使用。通过ViewModel,实现了屏幕旋转时状态的正确保留。
534

被折叠的 条评论
为什么被折叠?



