首页 > 解决方案 > 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 中的值将没有时间初始化,并且在视图出现时它将为空(这还没有发生,但理论上可能?),因此滑块的值将不相关。这个问题有什么解决办法吗?

标签: androidandroid-livedataandroid-jetpack-compose

解决方案


推荐阅读