LiveData 与 StateFlow:我们应该从实时数据切换到状态流吗?

Swe*_*ain 33 android android-livedata kotlin-flow kotlin-stateflow android-studio-arctic-fox

我遇到过建议切换到 StateFlow 的文章。就像这里的那个一样。同样在新的 Android studio 中,StateFlow 支持自动包含在数据绑定功能中,包括协程依赖项。实时数据已在大多数应用程序中使用。我们应该从 LiveData 迁移到 StateFlow 吗?有什么好处?

在此输入图像描述

Jer*_*olo 31

状态流和实时数据没有太大区别。主要区别在于状态流需要初始值,因此无需检查可为空性。第二个区别在于注销消费者;当视图进入停止状态时,实时数据会自动执行此操作,而状态流则不会。要实现与实时数据类似的行为,您可以将流收集到Lifecycle.repeatOnLifecycle块中。

状态流的好处

  • 状态流包含在协程库中,可用于多平台项目
  • 在您的项目中使用一个 API(Flow),而不是两个(LiveData 和 Flow)。
  • 这是 Kotlin,为什么不呢

  • @SamChen `lifecyclescope.launchWhenStarted { }` 的问题是它会挂起协程,并且当生命周期停止但生产者仍在处理数据时,无法从 UI 收集更多数据。仅在视图被销毁后才会取消流。使用 Lifecycle.repeatOnLifecycle,您可以指定一个生命周期状态作为参数,每次满足该状态时,都会调用一个新的协程,并且当状态生命周期低于指定的状态时,它会被取消。https://medium.com/androiddevelopers/a-safer-way-to-collect-flows-from-android-uis-23080b1f8bda (13认同)
  • 而且它与 android 框架没有依赖关系(与 LiveData 不同),这允许在我们的视图模型中避免使用 android (3认同)

小智 9

这取决于你想要什么,

如果您想要对应用程序进行手动、全面和多功能的控制,请选择状态流

如果您想要为您的应用程序提供半自动或相对易于使用的方法,我会说 - 坚持使用实时数据

如果您想知道我的个人意见,那就是状态流,因为我更喜欢控制而不是易于使用。我不介意为其多写几行,因为有时它对我很有用。

可以把它想象成使用汽水开瓶器和指甲刀,我可以用两者来完成,但是汽水开瓶器在这种情况下很容易使用,但是,没有像指甲刀那样的多功能性。

归根结底,我每次都使用状态流,因为我懒得学习某些项目的实时数据,因为状态流可以做实时数据可以做的事情,尽管实时数据会容易得多。

你应该决定你想选择什么,如果你不像我那么懒,我建议两者都选,每次都使用合适的一个。

干杯。