StateFlow 和 LiveData 有什么区别?

问题描述 投票:0回答:1

正如我在标题中提到的,我很好奇两者之间的一般差异。你能帮忙吗?我找不到具体的区别,因为互联网上有复杂的例子。

  1. 性能方面有何差异?
  2. 在哪些场景下有优势?
  3. 将 StateFlow 与 Kotlin Flow 结合使用是有优势的。但是在使用 LiveData 的项目中不切换到 StateFlow 会有什么风险呢?
  4. Google 是否会弃用 LiveData? :)
android kotlin android-livedata kotlin-flow kotlin-stateflow
1个回答
17
投票

我刚刚切换到

StateFlow
,所以这是我回答你的问题的好时机。


性能方面有何差异?

老实说,我不知道,但既然它是由 KotlinAndroid 推动的,就相信它们吧:)。


在哪些场景下有优势?

  1. 对于

    LiveData
    ,您不必强制给出初始值,最终可能会在
    init{}
    中编写更多代码;但是对于
    StateFlow
    ,你强制给出一个初始值(包括
    null
    ),它可能会节省你的代码一些。

  2. 对于

    LiveData
    即使你给出了一个初始值,当你访问它的value时仍然需要做
    Null Check
    (参见this),这有点烦人。但这不会发生在
    StateFlow
    上——它应该是这样的。

  3. 对于

    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?

我会说是,他们会说不,不,因为“还没有大声说出来”:)。

© www.soinside.com 2019 - 2024. All rights reserved.