我看到有些文章推荐使用StateFlow技术,比如这里的文章。 此外,在新版Android Studio中,StateFlow已经自动包含在数据绑定的功能中,包括协程依赖项。 LiveData已经被大部分应用程序所使用。 我们该从LiveData迁移到StateFlow吗?有哪些好处呢?
我看到有些文章推荐使用StateFlow技术,比如这里的文章。 此外,在新版Android Studio中,StateFlow已经自动包含在数据绑定的功能中,包括协程依赖项。 LiveData已经被大部分应用程序所使用。 我们该从LiveData迁移到StateFlow吗?有哪些好处呢?
State Flow(状态流)和 LiveData(生命周期感知的可观察数据容器)之间并没有太大的区别。主要区别在于,State Flow 需要一个初始值,因此不需要检查是否为空。其次,当视图进入 STOPPED 状态时,LiveData 会自动取消注册消费者,而 State Flow 则不会。为了实现与 LiveData 相似的行为,您可以在 Lifecycle.repeatOnLifecycle
块中收集 State Flow。
State Flow 的优点
lifecycleScope.launchWhenStarted { }
。 - Sam ChenlifecycleScope.launchWhenStarted { }
的问题在于它会暂停协程,当生命周期处于 STOPPED 状态时,UI 就不能再收集更多的数据。但是生产者仍然在处理数据。只有在视图被 DESTROYED 后才会取消流。使用 Lifecycle.repeatOnLifecycle,您可以将 Lifecycle State 作为参数指定,每次满足该状态时都会调用一个新的协程,并在生命周期状态低于指定状态时取消它。https://medium.com/androiddevelopers/a-safer-way-to-collect-flows-from-android-uis-23080b1f8bda - Jeremiah Polo这要看你的需求,
如果你想要一个手动、全面且灵活控制应用程序的方法,则选择状态流
如果你想要一个部分自动化或相对易于使用的方法来处理应用程序,则我建议——坚持使用LiveData。
如果你想知道我的个人意见,那就是状态流,因为我更喜欢控制而不是易于使用。我不介意写一些额外的代码,因为有时它对我很有用。
可以将其视为使用苏打水瓶开启器和指甲刀一样。两种方式都能行得通,但在这种情况下,开启器更容易使用,但像指甲刀那样多才多艺的功能则没有那么多。
而最终,我总是使用状态流,因为对于某些项目来说,我懒得去学习LiveData,尽管LiveData会更容易。
你应该决定你要选择什么,如果你不像我这么懒,我建议你两种方式都尝试一下,并根据实际情况选用适合的方法。
干杯!
Flow是最佳实践
Livedata用于观察数据,而无需处理生命周期问题。而Kotlin flow用于连续的数据集成,并简化异步编程。
以Room Library为例。首先,它使用livedata将数据从数据库传输到UI。它解决了大部分现有问题。但是当数据库发生任何未来更改时,livedata在这种情况下无能为力。
过了一段时间,room使用Kotlin flow解决了这个问题。通过Flow作为返回类型,room在不编写任何额外代码的情况下创建了一个新的无缝数据集成应用程序内的数据库和UI之间的可能性。
在medium网站上阅读此文章
可变性:LiveData是可变的,表示其值可以被更改;State是不可变的,表示其值不能直接被更改。
生命周期感知:LiveData是生命周期感知的,而State则不是。
转换:LiveData支持通过Transformations类进行转换,而State则不支持。
一般来说,如果您需要持有和观察需要在UI中更新的数据,并且希望这些数据具有生命周期感知能力,则LiveData是一个很好的选择。如果您需要持有和观察不经常更改的不可变数据,则State是一个很好的选择。
另外,值得考虑的是,您是否需要转换或者映射所持有和观察的数据。如果是这样,LiveData是更好的选择,因为它支持通过Transformations类进行转换。