mutableStateof 和 livedata&viewmodel 有什么区别?

Jac*_*_Du 1 android kotlin android-jetpack-compose

我是 Android Jetpack Compose 的新手。我想使用可观察的数据,当数据发生变化时,用户界面会自动更新。我遇到的解决方案有两种:

  1. 可变状态
@Composable
fun test(){
   var list = mutableStateListOf<String>();
   LazyColumn(
            modifier = Modifier
                .fillMaxSize()
                .background(Color(0xDE, 0xDE, 0xDE, 0xFF))
                .clickable(onClick = {
                   //when i click the whole list, it delete the last element of list, and then automatically update view
                   list.removeLast()
            }),
            verticalArrangement = Arrangement.spacedBy(10.dp)
        ) {
            items(list) {
                Text(text = it)
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

2.LiveData&viewModel

class TermModel : ViewModel() {
   
    private val termList = mutableStateListOf<Term>()
    private val termListLiveData: MutableLiveData<List<Term>> = MutableLiveData()
    
    fun removeLast(){
     //omit removing logic
    }
}

@Composable
fun test(){
   val list by termModel.termListLiveData.observeAsState(listOf())
   LazyColumn(
            modifier = Modifier
                .fillMaxSize()
                .background(Color(0xDE, 0xDE, 0xDE, 0xFF))
                .clickable(onClick = {
                   //when i click the whole list, it delete the last element of list, and then automatically update view
                   list.deleteLast()
            }),
            verticalArrangement = Arrangement.spacedBy(10.dp)
        ) {
            items(list) {
                Text(text = it)
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

看起来只是使用方便mutableStateoflivedata&viewmodel比较复杂,那么有什么区别呢?每种情况适合什么场景?

Ten*_*r04 6

首先,没有理由将 LiveData 与 ViewModel 配对。ViewModel 可以与任何东西一起使用:LiveData、MutableState、StateFlow 等。

State/MutableState 是专门为 Compose 设计的。当它value发生变化时,它会自动触发重组。由于它是专门为 Compose 设计的,因此对于非 Compose 应用程序来说并不是很有用。如果没有 Compose,就没有简单的方法来观察它的变化。

LiveData 更通用,设计时并未考虑 Compose。为了在 Compose 中正确使用它,您必须将其转换为 State,observeAsState以便它在发生变化时触发重组value

(需要注意的第三种类型是 SharedFlow 及其子类型 StateFlow。它们与 LiveData 有一些相似之处,但更通用,因为它们根本不依赖于 Android 库。它们是 Kotlin 协程库的一部分。要在 Compose 中使用它们,您需要使用 来将它们转换为 State collectAsState。)

ViewModel 是一个类,其主要用途是当 Activity 由于配置更改而被销毁并重新创建时,在内存中保存该 Activity 的数据。这个功能也可以通过使用纯 Compose 来实现rememberSavable。但 ViewModel 可以在可组合项之外使用,并且用途更广泛。您可以设计一个不使用 State 的 ViewModel,它在使用或不使用 Compose 的 Activity 中都很有用。

名称“ViewModel”暗示了 MVVM 架构模式的 ViewModel,但您不一定必须以这种方式使用它(Google 作者已声明他们并不打算暗示应该如何使用它)。但如果您这样做,它将用作 UI 和数据源/存储库之间的中间层,并且可能应该避免 UI 指定的类型,例如 State/MutableState。