android - Jetpack Compose 滑块性能
问题描述
使用 LiveData 存储滑块的值会使其滞后并移动生涩(我想是因为 postValue())
@Composable
fun MyComposable(
viewModel: MyViewModel
) {
val someValue = viewModel.someValue.observeAsState()
Slider(someValue) {
viewModel.setValue(it)
}
}
class MyViewModel() : ViewModel() {
val someValue: LiveData<Float> = dataStore.someValue // MutableLiveData
fun setValue(value: Float) {
dataStore.setValue(value)
}
}
class MyDataStore() {
val someValue = MutableLiveData<Float>()
fun setValue(value: Float) {
// Some heavy logic
someValue.postValue(value)
}
}
据我了解, postValue() 需要一段时间,因此,滑块似乎试图抵制更改值。
为了以某种方式解决这个问题,我必须创建额外的状态变量,以便滑块直接更新其值
@Composable
fun MyComposable(
viewModel: MyViewModel
) {
val someValue = viewModel.someValue.observeAsState()
var someValue2 by remember { mutableStateOf(someValue) }
Slider(someValue2) {
someValue2 = it
viewModel.setValue(it) // I also had to remove postValue ()
}
}
据我了解,如果来自 DataStore 的数据有延迟,那么 someValue 中的值将没有时间初始化,并且在视图出现时它将为空(这还没有发生,但理论上可能?),因此滑块的值将不相关。这个问题有什么解决办法吗?
解决方案
推荐阅读
- javascript - Javascript 抓取清理 - TMview
- python-3.x - python中释放内存的简单方法
- javascript - 如果动态文本框为空,如何禁用按钮
- html - SVG 作为内嵌在样式属性中的背景图像
- c# - C#以int数组为索引过滤for循环的更快方法?
- java - 验证上传的 jpg 和 png 文件并保存到静态文件夹
- javascript - 使 SQLite 错误具体化,而不仅仅是 express/node.js 中的 SQLITE_ERROR
- python - 如何从数据框动态生成 excel 并在 Python 中作为电子邮件发送?
- javascript - 如何使用javascript在嵌套对象数组中按属性分配值
- asp.net - 在 MVC5 的列表中显示 Ping 状态