LiveData和StateFlow:我们应该从LiveData转换到StateFlow吗?

31

我看到有些文章推荐使用StateFlow技术,比如这里的文章。 此外,在新版Android Studio中,StateFlow已经自动包含在数据绑定的功能中,包括协程依赖项。 LiveData已经被大部分应用程序所使用。 我们该从LiveData迁移到StateFlow吗?有哪些好处呢?

enter image description here


你可以在这里查看我的答案:https://dev59.com/8VEG5IYBdhLWcg3wSpOz#68775562 - Sam Chen
4个回答

30

State Flow(状态流)和 LiveData(生命周期感知的可观察数据容器)之间并没有太大的区别。主要区别在于,State Flow 需要一个初始值,因此不需要检查是否为空。其次,当视图进入 STOPPED 状态时,LiveData 会自动取消注册消费者,而 State Flow 则不会。为了实现与 LiveData 相似的行为,您可以在 Lifecycle.repeatOnLifecycle 块中收集 State Flow。

State Flow 的优点

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

1
为了在屏幕不可见时停止“流”,您可以使用lifecycleScope.launchWhenStarted { } - Sam Chen
13
@SamChen 使用 lifecycleScope.launchWhenStarted { } 的问题在于它会暂停协程,当生命周期处于 STOPPED 状态时,UI 就不能再收集更多的数据。但是生产者仍然在处理数据。只有在视图被 DESTROYED 后才会取消流。使用 Lifecycle.repeatOnLifecycle,您可以将 Lifecycle State 作为参数指定,每次满足该状态时都会调用一个新的协程,并在生命周期状态低于指定状态时取消它。https://medium.com/androiddevelopers/a-safer-way-to-collect-flows-from-android-uis-23080b1f8bda - Jeremiah Polo
1
非常好的观点,谢谢,我学到了很多! - Sam Chen
3
它与Android框架没有依赖关系(不像LiveData),这使得我们可以避免在视图模型中使用Android。 - Yago Rey
@Yago 是的,非常好的观点。 - Oke Uwechue
我不相信这会模仿LiveData的行为。使用LiveData时,如果在屏幕不可见时发出一个项目(例如用户将应用程序放到后台),当用户重新打开屏幕时,他们将按预期接收到数据(即LiveData实际上会保留该项,直到Activity / Fragment回到可以传递该数据的状态)。但是使用“repeatOnLifecycle”方法,在这种情况下数据将会丢失。 - Bitcoin Cash - ADA enthusiast

9

这要看你的需求,

如果你想要一个手动、全面且灵活控制应用程序的方法,则选择状态流

如果你想要一个部分自动化或相对易于使用的方法来处理应用程序,则我建议——坚持使用LiveData。

如果你想知道我的个人意见,那就是状态流,因为我更喜欢控制而不是易于使用。我不介意写一些额外的代码,因为有时它对我很有用。

可以将其视为使用苏打水瓶开启器和指甲刀一样。两种方式都能行得通,但在这种情况下,开启器更容易使用,但像指甲刀那样多才多艺的功能则没有那么多。

而最终,我总是使用状态流,因为对于某些项目来说,我懒得去学习LiveData,尽管LiveData会更容易。

你应该决定你要选择什么,如果你不像我这么懒,我建议你两种方式都尝试一下,并根据实际情况选用适合的方法。

干杯!


1

Flow是最佳实践

Livedata用于观察数据,而无需处理生命周期问题。而Kotlin flow用于连续的数据集成,并简化异步编程。

以Room Library为例。首先,它使用livedata将数据从数据库传输到UI。它解决了大部分现有问题。但是当数据库发生任何未来更改时,livedata在这种情况下无能为力。

过了一段时间,room使用Kotlin flow解决了这个问题。通过Flow作为返回类型,room在不编写任何额外代码的情况下创建了一个新的无缝数据集成应用程序内的数据库和UI之间的可能性。

在medium网站上阅读此文章


12
"Livedata在这种情况下是无助的",我认为这并不正确。当房间数据库更新时,LiveData也可以发送更新,而无需从Room轮询数据。 - murali kurapati
@muralikurapati 是否有可能使LiveData仅具有最新值(合并),以便如果对更改值进行多个调用,则仅使用最新的一个?如果在后台线程中多次调用“postValue”,而UI线程在此期间仍在运行,那么它不会为每次postValue获取多个观察值吗? - android developer

1
在Android中,LiveData和State是两个可以用来在应用程序中持有和观察数据的类。这两个类都是Android架构组件库的一部分,该库是用于构建强大、可测试和可维护应用程序的一组库。
LiveData是一个生命周期感知的数据持有者,意味着它只向处于活动状态的观察者提供更新。它非常适合持有需要在UI中观察和更新的数据,例如来自网络请求或数据库查询的数据。
State是一个数据持有者,表示可以被观察的不可变状态值。它非常适合持有不经常更改或不应直接修改的数据。
选择使用哪个类取决于您的具体需求和要求。在决定使用LiveData还是State时,需要考虑以下几个因素:

可变性:LiveData是可变的,表示其值可以被更改;State是不可变的,表示其值不能直接被更改。
生命周期感知:LiveData是生命周期感知的,而State则不是。
转换:LiveData支持通过Transformations类进行转换,而State则不支持。
一般来说,如果您需要持有和观察需要在UI中更新的数据,并且希望这些数据具有生命周期感知能力,则LiveData是一个很好的选择。如果您需要持有和观察不经常更改的不可变数据,则State是一个很好的选择。

另外,值得考虑的是,您是否需要转换或者映射所持有和观察的数据。如果是这样,LiveData是更好的选择,因为它支持通过Transformations类进行转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接