问题标签 [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.
android - SharedFlow 不会在片段(收集)处向订阅者发出值
我想使用SharedFlow
而不是StateFlow
因为第一个不需要初始值
视图模型:
片段:
我只是第一次尝试使用它,所以我不完全理解它是如何工作的。
如果我替换shareIn
为stateIn
并设置null
为初始值(第三个参数),它工作正常,但是在collect
回调中我需要检查它是否不是null
在提交PagingData
给适配器之前
更新
似乎如果在开始收集 SharedFlow 之前发出值,那么新订阅者将不会收到最新值
所以我需要更改shareIn(viewModelScope, SharingStarted.Eagerly)
为
或者
让它发挥作用
但是哪一个更好呢?我只需要保留相同的单个实例PagingData
android - Flow 不会更新 Composable
我遇到了以下问题:
有注册屏幕,上面有几个输入字段。当用户输入内容时,该值将传递给 ViewModel,设置为屏幕状态并通过 StateFlow 传递回屏幕。从可组合中,我正在观察这个 StateFlow。问题是 Composable 在向 Flow 发送新值后不会失效。
这是 ViewModel 代码:
这是可组合的代码:
提前感谢您的帮助
android - 在 Composable 中收集转换后的 StateFlow
有collectAsState()
适用于StateFlow
属性的功能,以便在 中观察它Composable
。
可组合项需要 aStateFlow
因为StateFlow
保证初始值。AFlow
不附带该保证。
现在,如果我有一个StateFlow
属性,但我想map
在收集之前应用一个运算符(如 )Flow
,该Composable
怎么办?
这里有一个例子:
假设一个存储库公开了一个StateFlow<MyClass>
...并且视图模型依赖于存储库,并且只想将属性公开a
给它的Composable
...
运算符将map
类型从 更改StateFlow<MyClass>
为Flow<String>
。
aFlow
不再有初始值在语义上是否合理?毕竟它的第一次发射是从 的初始值导出的myClassStateFlow
。- 它需要在某个时候转换
Flow
回。StateFlow
哪个是更惯用的地方?- 在视图模型中使用
stateIn()
?代码会是什么样子? - 在可组合中使用
collectAsState(initial: MyClass)
并得出一个初始值(虽然myClassStateFlow
有一个初始值)?
- 在视图模型中使用
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
android - StateFlow:收集后取消旧的发射状态
我在 kotlin 流程中相对较新,我正在使用 android 中的流程创建登录模块。过去几天,我在 ViewModels 中收集它时一直被困在流程中,但是当我使用错误的凭据请求其缓存所有状态时,我遇到了问题。输入正确的凭据后,用户导航到主 Activity,但 MainActivity 的实例正在使用每个发出的状态创建:Example(User Enter 3 wrong Credential and 1 Right Credential: 4 Instance of MainActivity Created)。那么,有什么方法可以取消之前的发射并只显示最新的请求。我也在使用 collectLatest ,但它也不起作用。下面是代码。
登录活动
登录视图模型
登录存储库
网络绑定存储库
有什么方法可以创建 MainAcitivity 的一个实例而忽略较旧的发出响应?任何可以工作的操作员。非常感谢这方面的任何帮助。谢谢。
android - 安卓。SharedFlow 用于更新状态
是否可以订阅来自不同活动的 SharedFlow 状态更改。例如,我有 Activity A 和 Activity B。在 Activity BI 内部需要获取一些数据,当我返回 Activity A 时,屏幕需要由 Activity B 的数据更新。也就是说,当请求接收数据发送到Activity B,我可以在请求完成之前返回上一屏,此时加载状态应该会显示在上一屏(Activity A)上。当接收到数据时,它们应该显示在活动 A 中。为此,我想使用带有 SharedFlow 的通用单例存储库。在活动B中,我会向repository请求数据,此时状态会更新,一旦收到数据,就会出现在活动A中。是否可以使用共享流来实现。
android - 有没有办法从 Flow 中创建 StateFlow
我可以从 Flow 中创建 StateFlow 以便获得它的 .value 吗?有没有办法在不使用 .collect 的情况下做到这一点?
就像是
这样以后,当有人单击按钮时,我可以说出流的最后一个值是多少?
我宁愿不使用收集,因为我不希望流程流动,直到其他人决定收集它。
android - 我们如何保存和恢复 Android StateFlow 的状态?
我们可以通过以下类似的方式创建 LiveData 或 StateFlow
但是在 LiveData 中,我们可以通过使用来确保数据的保存和恢复
对于 StateFlow,有没有办法(或 API)来保留最后一个值并恢复它,就像我们在 LiveData 中所拥有的那样?
android - 使用 StateFlow 更新列表适配器
我试图在填充我的 ListAdapter 时从 LiveData 切换到 StateFlow。
我目前有一个MutableLiveData<List<CustomClass>>
我正在观察更新列表适配器的:
这工作正常。现在我将viewModel 中的 替换为MutableLiveData<List<CustomClass>?>
:MutableStateFlow<List<CustomClass>?>
我正在这样的片段中收集新列表:
但是,当我调用 loadCustomClassListByNetwork() 时,列表适配器不会更新。为什么我无法收集价值
android-jetpack-compose - jetpack compose stateflow 不刷新列表
在我的项目中,我有两个片段。
一个是a normal fragment
,另一个是a bottomSheetDialogFragment
。
在我的normal fragment
,我有一个lazyColumn。
我想在 bottomSheetDialogFragment 中进行一些设置并创建一个新Hiit
对象并将其放入我hiitItems
的viewmodel
.
问题是,由于 mynormal fragment
部分被 覆盖,所以bottomSheetDialogFragment
当我的列表更改时,jetpack compose 不会重新组合。
所以我决定转向stateFlow
考虑到它总是在发射,我认为这可能会导致重组。但不幸的是,它没有。
以下是我的代码:
在我的normal fragment
中,我使用 composeView 来利用jetpack compose
:
在我的bottomSheetDialogFragment
中,我有一个按钮,其功能是将新创建的 hiitItem 添加到我的hiitItems
列表中,并导致重组:
知道为什么在hiitItems
我关闭bottomSheetDialogFragment 后列表中的更改不会导致重新组合吗?