正如我在标题中提到的,我很好奇两者之间的一般差异。你能帮忙吗?我找不到具体的区别,因为互联网上有复杂的例子。
我刚刚切换到
StateFlow
,所以这是我回答你的问题的好时机。
性能方面有何差异?
老实说,我不知道,但既然它是由 Kotlin 和 Android 推动的,就相信它们吧:)。
在哪些场景下有优势?
对于
LiveData
,您不必强制给出初始值,最终可能会在init{}
中编写更多代码;但是对于StateFlow
,你强制给出一个初始值(包括null
),它可能会节省你的代码一些。
对于
LiveData
即使你给出了一个初始值,当你访问它的value
时仍然需要做Null Check(参见this),这有点烦人。但这不会发生在
StateFlow
上——它应该是这样的。
对于
LiveData
,你无法轻松或优雅地观察ViewModel
内的数据变化JUST,你只能使用
observeForever()
,这也在here中提到。但对于 StateFlow
来说很简单,如下所示:
class FirstViewModel() : ViewModel() {
val uiScope = viewModelScope
val name = MutableStateFlow("Sam") //must have initial value
//val name = MutableStateFlow<String?>(null) //null is acceptable
init {
observeName()
}
private fun observeName() = uiScope.launch { //must run in coroutine scope
name.collect { name -> //for Fragment / Activity, use lifecycleScope.launch{}
//do your stuff
}
}
}
将 StateFlow 与 Kotlin Flow 结合使用是有优势的。但是在使用 LiveData 的项目中不切换到 StateFlow 会有什么风险呢?
在使用 Java 的项目中不切换到 Kotlin 有什么风险? :)
Google 是否会弃用 LiveData?
我会说是,他们会说不,不,因为“还没有大声说出来”:)。