问题标签 [kotlin-stateflow]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
242 浏览

android - SharedFlow 不会在片段(收集)处向订阅者发出值

我想使用SharedFlow而不是StateFlow因为第一个不需要初始值

视图模型

片段

我只是第一次尝试使用它,所以我不完全理解它是如何工作的。

如果我替换shareInstateIn并设置null为初始值(第三个参数),它工作正常,但是在collect回调中我需要检查它是否不是null在提交PagingData给适配器之前

更新

似乎如果在开始收集 SharedFlow 之前发出值,那么新订阅者将不会收到最新值

所以我需要更改shareIn(viewModelScope, SharingStarted.Eagerly)

或者

让它发挥作用

但是哪一个更好呢?我只需要保留相同的单个实例PagingData

0 投票
2 回答
183 浏览

android - Flow 不会更新 Composable

我遇到了以下问题:

有注册屏幕,上面有几个输入字段。当用户输入内容时,该值将传递给 ViewModel,设置为屏幕状态并通过 StateFlow 传递回屏幕。从可组合中,我正在观察这个 StateFlow。问题是 Composable 在向 Flow 发送新值后不会失效。

这是 ViewModel 代码:

这是可组合的代码:

提前感谢您的帮助

0 投票
1 回答
104 浏览

android - 在 Composable 中收集转换后的 StateFlow

collectAsState()适用于StateFlow属性的功能,以便在 中观察它Composable

可组合项需要 aStateFlow因为StateFlow保证初始值。AFlow不附带该保证。

现在,如果我有一个StateFlow属性,但我想map在收集之前应用一个运算符(如 )Flow,该Composable怎么办?

这里有一个例子:

假设一个存储库公开了一个StateFlow<MyClass>

...并且视图模型依赖于存储库,并且只想将属性公开a给它的Composable...

运算符将map类型从 更改StateFlow<MyClass>Flow<String>

  1. aFlow不再有初始值在语义上是否合理?毕竟它的第一次发射是从 的初始值导出的myClassStateFlow
  2. 它需要在某个时候转换Flow回。StateFlow哪个是更惯用的地方?
    1. 在视图模型中使用stateIn()?代码会是什么样子?
    2. 在可组合中使用collectAsState(initial: MyClass)并得出一个初始值(虽然myClassStateFlow有一个初始值)?
0 投票
1 回答
332 浏览

android - 执行 com.android.build.gradle.internal.tasks.MergeJavaResWorkAction 时发生故障

请帮助构建错误。

Kotlin 版本:1.5.31 Gradle-zip:7.2 Gradle 版本:7.0.3

任务 ':app:mergeDebugJavaResource' 执行失败。

执行 com.android.build.gradle.internal.tasks.MergeJavaResWorkAction 2 文件时发生故障,从输入中找到路径 'kotlin/internal/internal.kotlin_builtins':/Users/Umut/.gradle/caches/transforms-3/98f5d2ab243e47179d111ce52d349da0 /transformed/jetified-kotlin-compiler-embeddable-1.5.31.jar /Users/Umut/.gradle/caches/transforms-3/3af4d33202657704115aebc723152cf8/transformed/jetified-kotlin-stdlib-1.5.31.jar 添加一个 PackagingOptions 块可以帮助,更多信息请参考 https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html

0 投票
1 回答
84 浏览

android - StateFlow:收集后取消旧的发射状态

我在 kotlin 流程中相对较新,我正在使用 android 中的流程创建登录模块。过去几天,我在 ViewModels 中收集它时一直被困在流程中,但是当我使用错误的凭据请求其缓存所有状态时,我遇到了问题。输入正确的凭据后,用户导航到主 Activity,但 MainActivity 的实例正在使用每个发出的状态创建:Example(User Enter 3 wrong Credential and 1 Right Credential: 4 Instance of MainActivity Created)。那么,有什么方法可以取消之前的发射并只显示最新的请求。我也在使用 collectLatest ,但它也不起作用。下面是代码。

登录活动

登录视图模型

登录存储库

网络绑定存储库

有什么方法可以创建 MainAcitivity 的一个实例而忽略较旧的发出响应?任何可以工作的操作员。非常感谢这方面的任何帮助。谢谢。

0 投票
0 回答
86 浏览

android - 安卓。SharedFlow 用于更新状态

是否可以订阅来自不同活动的 SharedFlow 状态更改。例如,我有 Activity A 和 Activity B。在 Activity BI 内部需要获取一些数据,当我返回 Activity A 时,屏幕需要由 Activity B 的数据更新。也就是说,当请求接收数据发送到Activity B,我可以在请求完成之前返回上一屏,此时加载状态应该会显示在上一屏(Activity A)上。当接收到数据时,它们应该显示在活动 A 中。为此,我想使用带有 SharedFlow 的通用单例存储库。在活动B中,我会向repository请求数据,此时状态会更新,一旦收到数据,就会出现在活动A中。是否可以使用共享流来实现。

0 投票
1 回答
68 浏览

android - 有没有办法从 Flow 中创建 StateFlow

我可以从 Flow 中创建 StateFlow 以便获得它的 .value 吗?有没有办法在不使用 .collect 的情况下做到这一点?

就像是

这样以后,当有人单击按钮时,我可以说出流的最后一个值是多少?

我宁愿不使用收集,因为我不希望流程流动,直到其他人决定收集它。

0 投票
2 回答
122 浏览

android - 我们如何保存和恢复 Android StateFlow 的状态?

我们可以通过以下类似的方式创建 LiveData 或 StateFlow

但是在 LiveData 中,我们可以通过使用来确保数据的保存和恢复

对于 StateFlow,有没有办法(或 API)来保留最后一个值并恢复它,就像我们在 LiveData 中所拥有的那样?

0 投票
2 回答
264 浏览

android - 使用 StateFlow 更新列表适配器

我试图在填充我的 ListAdapter 时从 LiveData 切换到 StateFlow。

我目前有一个MutableLiveData<List<CustomClass>>我正在观察更新列表适配器的:

这工作正常。现在我将viewModel 中的 替换为MutableLiveData<List<CustomClass>?>MutableStateFlow<List<CustomClass>?>

我正在这样的片段中收集新列表:

但是,当我调用 loadCustomClassListByNetwork() 时,列表适配器不会更新。为什么我无法收集价值

0 投票
2 回答
286 浏览

android-jetpack-compose - jetpack compose stateflow 不刷新列表

在我的项目中,我有两个片段。

一个是a normal fragment,另一个是a bottomSheetDialogFragment

在我的normal fragment,我有一个lazyColumn。

我想在 bottomSheetDialogFragment 中进行一些设置并创建一个新Hiit对象并将其放入我hiitItemsviewmodel.

问题是,由于 mynormal fragment部分被 覆盖,所以bottomSheetDialogFragment当我的列表更改时,jetpack compose 不会重新组合。

所以我决定转向stateFlow考虑到它总是在发射,我认为这可能会导致重组。但不幸的是,它没有。

以下是我的代码:

在我的normal fragment中,我使用 composeView 来利用jetpack compose

在我的bottomSheetDialogFragment中,我有一个按钮,其功能是将新创建的 hiitItem 添加到我的hiitItems列表中,并导致重组:

知道为什么在hiitItems我关闭bottomSheetDialogFragment 后列表中的更改不会导致重新组合吗?