StateFlow 和 LiveData 有什么区别?

sno*_*lax 17 android kotlin android-livedata kotlin-flow kotlin-stateflow

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

  1. 在性能方面有哪些差异?
  2. 在哪些场景下有优势?
  3. 将 StateFlow 与 Kotlin Flow 结合使用是有利的。但是在使用 LiveData 的项目中不切换到 StateFlow 会有什么风险呢?
  4. Google 是否会弃用 LiveData?:)

Sam*_*hen 18

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


在性能方面有哪些差异?

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


在哪些场景下有优势?

  1. 因为LiveData您不会被迫给出初始值,所以最终可能会在init{};中编写更多代码。但对于StateFlow被迫给出一个初始值(包括null),它可能会节省你的代码一点。

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

  3. 由于LiveData您无法轻松或优雅地观察内部的数据变化,因此ViewModel您将使用这里observeForever()也提到的。但为了简单起见,请按以下方式操作: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
             }
         }
     }
    
    Run Code Online (Sandbox Code Playgroud)

将 StateFlow 与 Kotlin Flow 结合使用是有利的。但是在使用 LiveData 的项目中不切换到 StateFlow 会有什么风险呢?

在使用Java 的项目中不切换到Kotlin会有什么风险?:)


Google 是否会弃用 LiveData?

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

  • @SamChen 这听起来像是一个不寻常的用例,文档中的所有 Google 示例都有“StateFlow”直接更新 UI。我不明白“StateFlow”的目的。听起来它与“LiveData”相同,只不过现在你必须在 Activity/Fragment 中处理你的协程(谷歌自己声称这是不好的做法)。 (2认同)
  • @SamChen 我终于有机会观看视频了,但仍然不明白“StateFlow”的好处。他给出的唯一真正的论据是,现在您可以将片段作为生命周期所有者而不是“viewLifecycleOwner”传递。我认为这又是一种没有任何好处的 Android 时尚。 (2认同)