标签: kotlin-flow

将 pagingData 3 流与另一个流结合起来

我有一个 pagingData 流对象,我想将其与不同的融合位置流组合起来,以便它将根据 pagingdata 列表的每个项目进行相应的处理。

val point : Flow<Point> 
val pagingDate : Flow<PagingData>
Run Code Online (Sandbox Code Playgroud)

我尝试使用组合和组合变换,但它似乎不起作用,因为当更新应用程序崩溃时,并显示与 pagingData 3 相关的错误消息不能发出两次

java.lang.IllegalStateException: 尝试从pageEventFlow收集两次,这是非法操作。您是否忘记调用 Flow<PagingData<*>>.cachedIn(coroutineScope) ?

我可以选择哪些选项来使用流数据转换分页数据项?

android kotlin android-paging kotlin-coroutines kotlin-flow

6
推荐指数
1
解决办法
2822
查看次数

具有超时结果的 Kotlin Flow

我正在尝试在 CoroutineWorker(WorkManager) 中使用 Flow,并且该流应该侦听存储库中的值 5 秒,如果您在该时间范围内获得该值,则返回 Result.success() 然后忽略/取消计时器,如果时间过去了,则返回 Result.failure()

现在我有类似的事情,我正在尝试将超时纳入其中。

 repository.getListeningValue.onEach {
     //doStuff here with the result
 }.map{
     Result.success()
 }.first()
Run Code Online (Sandbox Code Playgroud)

android kotlin android-workmanager kotlin-coroutines kotlin-flow

6
推荐指数
1
解决办法
6768
查看次数

Kotlin Flow - 回调Flow 的替代品

我正在开发一个 Android 项目,其中MVVM使用了该架构。有一个用例,Flow我的aRepository需要根据回调的结果进行更新,当我的数据源中的某些内容发生更改时会触发该回调。对于这个问题最合适的选择似乎是callbackFlow. 然而,它仍处于实验阶段。我很想使用callbackFlow,但是,我知道任何未来的更改都可能会破坏某些代码,并且我不希望在生产应用程序中发生这种情况。考虑到上述情况,应该用什么来替代callbackFlow?或者我应该考虑继续吗callbackFlow

android callback mvvm kotlin kotlin-flow

6
推荐指数
1
解决办法
1348
查看次数

Kotlin Flow 如何组合两个流并仅在第一个流发送元素时发出结果

有两个流:FlowA 和 FlowB。

我想将它们组合起来,仅当 FlowA 发出元素时才从 FlowA 获取最新元素,并从 FlowB 获取最新元素。这就像组合 FlowA 和 FlowB,但仅当 FlowA 发出元素时才会触发组合流。

android kotlin kotlin-flow

6
推荐指数
1
解决办法
6150
查看次数

如何在 MutableStateFlow 中初始化密封类

我有一个这样的密封类

sealed class LoadState {
    class Loading : LoadState()
    class Success : LoadState()
    class Fail : LoadState()
}
Run Code Online (Sandbox Code Playgroud)

我将密封类与 LiveData 一起使用,它有效

open class BaseViewModel: ViewModel() {
//    val loadState by lazy {
//        MutableLiveData<LoadState>()
//    }
    val loadState by lazy {
        MutableStateFlow(LoadState())
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我将 MutableLiveData 更改为 MutableStateFlow 时,我收到这样的警告

Sealed types cannot be instantiated
Run Code Online (Sandbox Code Playgroud)

那么,如何在 MutableStateFlow 中使用密封类呢?

android sealed-class kotlin-flow kotlin-stateflow

6
推荐指数
2
解决办法
4181
查看次数

当应用程序处于后台时,flowWithLifecycle(lifecycle, Lifecycle.State.STARTED) 不会停止流程

我正在尝试观察View Collection 和上游流量已停止的结果。但当viewModel.testFlow应用程序在后台时仍在收集。为什么我看不到收集已停止?我观察到了什么错误吗?

视图模型:

val testFlow = flow<Int> {
    for (i in 1..100) {
        delay(1000)
        Timber.e("testFlow: EMIT = $i")
        emit(i)
    }
}
Run Code Online (Sandbox Code Playgroud)

活动:

override fun onViewCreated() {
        lifecycleScope.launch {
            viewModel.testFlow
                .flowWithLifecycle(lifecycle, Lifecycle.State.STARTED)
                .collect {
                    Timber.d("testFlow: $it Collected")
                }
        }
}

override fun onActivityPaused(activity: Activity) {
    super.onActivityPaused(activity)
    Timber.e("testFlow: onActivityPaused")
}
Run Code Online (Sandbox Code Playgroud)

日志 生命周期图

https://medium.com/androiddevelopers/a-safer-way-to-collect-flows-from-android-uis-23080b1f8bda

android kotlin kotlin-coroutines kotlin-flow kotlin-stateflow

6
推荐指数
1
解决办法
4100
查看次数

将流量转换为实时数据的最佳方式

我正在从 Unsplash api 实现搜索,数据将根据搜索进行更新

GalleryViewModel.kt

@HiltViewModel
class GalleryViewModel @Inject constructor(
    private val fetchPhotoUseCase:FetchPhotoUseCase,
    @Assisted state: SavedStateHandle
) :ViewModel(){

    companion object{
        private const val CURRENT_QUERY = "current_query" // key
        private const val DEFAULT_QUERY = "cats"
    }

    private val currentQuery = state.getLiveData(CURRENT_QUERY, DEFAULT_QUERY)
    
    val photos = currentQuery.switchMap { queryString ->
        liveData {
            fetchPhotoUseCase.execute(queryString).collect {  
                emit(it)
            }
        }
    }

   fun searchPhotos(query: String) {
    currentQuery.value = query
   }
}
Run Code Online (Sandbox Code Playgroud)

FetchPhotoUseCase.kt

class FetchPhotoUseCase @Inject constructor(
    private val repository: UnSplashRepository
) : UseCaseWithParams<String,Flow<PagingData<UnsplashPhoto>>>(){
    override suspend fun …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-livedata kotlin-coroutines kotlin-flow

6
推荐指数
1
解决办法
1万
查看次数

Kotlin 流中缓冲区之间的差异

据我所知,Kotlin 流程中有三种类型的缓冲区:Buffer、Conflate 和 CollectLatest,我很难弄清楚这三种终端运算符之间的差异。

flow.buffer().collect{...}
flow.collectLatest{...}
flow.conflate().collect{...}
Run Code Online (Sandbox Code Playgroud)

我很抱歉简洁,但是这些缓冲区之间有什么区别以及我们什么时候应该使用它们?

提前感谢任何帮助。

android kotlin kotlin-coroutines kotlin-flow

6
推荐指数
2
解决办法
3078
查看次数

Android 上 Kotlin Flows 存储库级别的内存缓存

假设您有一个从 Android 应用程序中的远程数据源下载的用户列表,并且由于某种原因您没有本地数据库。然后,该用户列表会在整个应用程序中多次用于ViewModel发出其他网络请求,因此您肯定希望在应用程序存在期间就将其缓存,并仅根据需要重新获取它。这必然意味着您希望将其缓存在Data Layer中(Repository在我的例子中是 a ),然后从您的ViewModels 中获取它。
\n在像 a 这样的状态持有者中很容易做到ViewModel- 只需制作 aStateFlow或其他什么。但是,如果我们希望存储库内有一个可用Flow的 of List<User>(在每个 API 请求后缓存在 RAM 中),然后从 UI 层收集该存储库,该怎么办?实现这一目标最可测试、最稳定最正确的方法是什么?
\n我最初的想法是这样的:

\n
class UsersRepository @Inject constructor(\n    private val usersApi: UsersApi,\n    private val handler: ResponseHandler\n) {\n\n    private val _usersFlow = MutableStateFlow<Resource<List<UserResponse>>>(Resource.Empty)\n    val usersFlow = _usersFlow.asStateFlow()\n\n    suspend fun fetchUserList() = withContext(Dispatchers.IO) {\n        _usersFlow.emit(Resource.Loading)\n        _usersFlow.emit(\n            handler {\n                usersApi.getUsers()\n            }\n        )\n    }\n}\n …
Run Code Online (Sandbox Code Playgroud)

android repository mvvm android-jetpack-compose kotlin-flow

6
推荐指数
1
解决办法
5454
查看次数

如果房间数据库中发生更改,Kotlin Flow 每次都会发出新数据吗?

假设这是示例代码

实时数据查询

Query("SELECT IFNULL(COUNT(id),0) FROM Item WHERE status = :status")
fun getLiveData(status: Int): LiveData<Int>
Run Code Online (Sandbox Code Playgroud)

Kotlin 流查询

@Query("SELECT IFNULL(COUNT(id),0) FROM Item WHERE status = :status")
fun getFlowData(status: Int): Flow<Int>
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,如果房间数据库中发生任何变化,Flow 会获取新数据吗?

android android-room android-livedata kotlin-flow

6
推荐指数
1
解决办法
2880
查看次数