android - 使用 mutableStateOf 而不是 observeAsState
问题描述
我在一个 Android 应用程序中使用 Jetpack Compose 并且遇到了我的 uiState (LiveData) 在每次重组时都设置为其初始值的问题,因为我已经像初始化它一样
val authUiState: AuthUIState by authenticationViewModel.uiState.observeAsState(AuthUIState.Loading)
在设置为正确值之前,它在每次重组时都设置为 Loading。当我尝试记住该值时,我了解到我们不能在记住块中使用observeAsState,最后将其更改为
val authUiState = remember{ mutableStateOf(authenticationViewModel.uiState.value) }.value
这行得通,但我不太确定,如果这是解决这个问题的常用和好方法。你怎么看?我应该采取不同的做法吗?你需要更多信息?
解决方案
查看uiState
您的视图模型内部是否类似于 LiveData 对象(从代码中看起来有点像),推荐的方法是将其作为可变状态存储在视图模型本身中。
var uiState by mutableStateOf (initialValue)
private set //Do not allow external modifications to maintain consistency of state
fun onUiStateChange(newValue: Any){
uiState = newValue
}
您只需要将其初始化为 MutableState,在其余代码中,以更新、删除或任何您想对它执行的操作,只需将其视为常规变量即可。每次更新值时,Compose 都会触发重新组合。
下面的代码片段几乎肯定不会工作,因为在这里,状态是你在 mutableStateOf() 中包装的任何内容,它只是一个简单的值,将从视图模型中获取一次,然后在整个重组过程中被记住,因此不会更改代码在这里触发
val authUiState by remember{ mutableStateOf(authenticationViewModel.uiState.value) }
据我所知,将视图模型中的状态存储为 mutableState 是 compose 的最佳实践。您将在 Android 开发人员的“State Codelab”中看到相同的内容
祝你好运
推荐阅读
- python - 如何将烧瓶与反应应用程序联系起来?
- angular - 使用从 angular-google-maps agmCircle 到打字稿文件的方法
- javascript - 在 reducer 中调度调度
- python - 在 ImageJ 中安装 python 脚本
- python - Python:如何在两个日期范围之间找到每个月的第一天
- python-3.x - Python Lex-Yacc 报告“检测到符号的无限递归”
- r - 如何在 z 方向剪辑线框图?
- python - Python:从 system32 或 SysWOW64 中删除文件夹的脚本
- java - 当有前导零时,整数会发生什么?
- amazon-web-services - AWS CloudFormation RDS 实例无法创建 - 找不到 DBCluster