难道collectAsStateWithLifecycle只适用于冷流,对热流没有帮助(例如stateFlow)?

Ely*_*lye 7 android android-lifecycle kotlin kotlin-flow kotlin-stateflow

最近,自 android 生命周期库版本 2.6.0-alpha01 以来,我们有了一个新的 API,即

\n
collectAsStateWithLifecycle(...)\n
Run Code Online (Sandbox Code Playgroud)\n

这是 Google Developer 在这篇文章中提倡的

\n
\n

如果您\xe2\x80\x99 使用 Jetpack Compose 构建 Android 应用程序,请使用\ncollectAsStateWithLifecycle可组合函数(而不是\n collectAsState

\n
\n

我尝试一下,对于流动(冷流)例如

\n
    val counter = flow {\n        var value = 0\n        while (true) {\n           emit(value++)\n           delay(1000)\n        }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

拥有它是有用的

\n
flow.collectAsStateWithLifecycle(0)\n
Run Code Online (Sandbox Code Playgroud)\n

但是如果我们有一个像 mutableStateFlow 这样的热流

\n
val stateFlow = MutableStateFlow(0)\n
Run Code Online (Sandbox Code Playgroud)\n

拥有似乎没什么用

\n
stateFlow.collectAsStateWithLifecycle(0)\n
Run Code Online (Sandbox Code Playgroud)\n

鉴于它不会阻止任何排放。

\n

我说collectAsStateWithLifecycle只对冷流有用,对热流无效,这样说对吗?

\n

如果我错了,你能给我举一个collectAsStateWithLifecycle对热流也有用的例子吗?

\n

Sty*_*kis 10

对于任何流量依赖于消费者来保持热的情况,它都是有用的。

如果你只是val stateFlow = MutableStateFlow(0)按照你说的去做,那不会改变任何事情,不会。

然而,一种重要的“热流”情况是,使用stateIn函数,使用WhileSubscribed策略作为的SharingStarted参数,流变得热stateIn。在这种情况下使用订阅collectAsStateWithLifecycle意味着当生命周期至少未STARTED或您传递给 的任何内容时,流将不会有订阅者minActiveState

  • 好的!谢谢,太好了。我也从作者那里得到了答案https://twitter.com/manuelvicnt/status/1587006978076938240 (2认同)