代码之家  ›  专栏  ›  技术社区  ›  Gabe Sechan

lifecycleScope和SharedFlow的组合是否消除了对ViewModels的需求?

  •  0
  • Gabe Sechan  · 技术社区  · 4 年前

    我第一次潜入Kotlin Flow,我想知道ViewModel是否还有一席之地。ViewModel的优势在于它具有生命周期意识,当活动被破坏时,它会自动取消对ViewModel的LiveData的订阅。Kotlin SharedFlow的工作原理与LiveData类似,因为它可以由多个观察者订阅。在Kotlin中,一个生命周期Scope协同程序应该在生命周期结束时取消所有子协同程序。所以,如果我们有这样的东西:

    lifecycleScope.launch(Dispatchers.IO) {
        //Do something
        flow.emit(result)
    }
    
    lifecycleScope.launch(Dispatchers.Main) {
        flow.collect {
            //Display the data
        }
    }
    

    当生命周期超出范围时,应取消此操作。我是不是遗漏了一个问题?或者有充分的理由使用ViewModels吗?这里假设除了LiveData或ViewModels之外,没有我需要与之交互的第三方库。

    1 回复  |  直到 4 年前
        1
  •  2
  •   che10    4 年前

    把整个讨论放在一边 LiveData vs SharedFlow StateFlow 。开始 ViewModels 正如你所问的。如果我们要通过文件

    ViewModel类旨在以生命周期意识的方式存储和管理与UI相关的数据。ViewModel类允许数据在配置更改(如屏幕旋转)后继续存在。

    UI控制器(如活动和片段)主要用于显示UI数据、对用户操作作出反应或处理操作系统通信(如权限请求)。要求UI控制器也负责从数据库或网络加载数据会给类增加膨胀。将过多的责任分配给UI控制器可能会导致一个类试图自己处理应用程序的所有工作,而不是将工作委派给其他类。以这种方式将过多的责任分配给UI控制器也会使测试变得更加困难。

    将视图数据所有权与UI控制器逻辑分离更容易、更高效。

    我想这总结得很好。确实 lifeCycleScope 可以消除的需要 ViewModel 在某种程度上,但是 ViewModel 不仅仅是一个持有者 LiveData .

    即使你想使用 SharedFlow StateFlow 结束 LiveData 我建议你还是利用 ViewModel 在里面使用 viewModelScope 而是仍然在UI和数据之间执行通常的和所需的关注点分离。

        2
  •  2
  •   Tenfour04    4 年前

    ViewModel在配置更改后仍然有效。活动和碎片没有。这就是ViewModel的主要用途。ViewModel确实如此 自动取消对其LiveData的订阅。LiveData独立完成这项工作。因此,SharedFlow的存在对ViewModel的有用性没有任何影响。

    如果您遵循MVVM模式并使用ViewModel作为VM,那么使用SharedFlow而不是LiveData将使其更接近于平台无关性和更容易进行单元测试。