标签: kotlin-flow

Kotlin Flow 与 Android LiveData

我有一些关于Kotlin Flow 的问题

  1. 我可以LiveData从多个 Fragment观察。我可以这样做Flow吗?如果是,那么如何?
  2. 我们可以使用&LiveData从单个中获得多个。有没有办法从一个来源获得多个?LiveDatamapswitchMapFlowFlow
  3. 使用MutableLiveDataI 可以使用变量引用从任何地方更新数据。有什么办法可以做同样的事情Flow吗?

我有一个用例,例如:我将观察一个SharedPreferencesusing callbackFlow{...},它会给我一个单一的源 Flow。从那个 Flow 中,我想为每个键值对创建多个 Flow。

这些可能听起来很愚蠢的问题。我是 Rx 和 Flow 世界的新手。

android kotlin android-livedata kotlin-coroutines kotlin-flow

60
推荐指数
3
解决办法
2万
查看次数

何时使用collect和collectLatest运算符来收集kotlin流程?

我想知道他们俩的实际场景。我知道其中的区别,但无法与我的实现联系起来。

kotlin kotlin-coroutines kotlin-flow

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

LiveData 与 StateFlow:我们应该从实时数据切换到状态流吗?

我遇到过建议切换到 StateFlow 的文章。就像这里的那个一样。同样在新的 Android studio 中,StateFlow 支持自动包含在数据绑定功能中,包括协程依赖项。实时数据已在大多数应用程序中使用。我们应该从 LiveData 迁移到 StateFlow 吗?有什么好处?

在此输入图像描述

android android-livedata kotlin-flow kotlin-stateflow android-studio-arctic-fox

33
推荐指数
2
解决办法
3万
查看次数

Kotlin Flow 的 Collect 是否只是内部 kotlinx.coroutines API?

https://kotlinlang.org/docs/reference/coroutines/flow.html#flows-are-cold的直接例子为例

fun simple(): Flow<Int> = flow { 
    println("Flow started")
    for (i in 1..3) {
        delay(100)
        emit(i)
    }
}

fun main() = runBlocking<Unit> {
    println("Calling simple function...")
    val flow = simple()
    println("Calling collect...")
    flow.collect { value -> println(value) } 
    println("Calling collect again...")
    flow.collect { value -> println(value) } 
}
Run Code Online (Sandbox Code Playgroud)

我得到了错误collect

This is an internal kotlinx.coroutines API that should not be used from outside of kotlinx.coroutines. No compatibility guarantees are provided.It is recommended to report your use-case of …
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-flow

27
推荐指数
4
解决办法
2944
查看次数

Kotlin Flow:为什么函数 merge() 最多只能接受 5 个流的参数

我注意到,combine() 函数最多只能接受 5 个流的参数

public fun <T1, T2, T3, T4, T5, R> combine(
    flow: Flow<T1>,
    flow2: Flow<T2>,
    flow3: Flow<T3>,
    flow4: Flow<T4>,
    flow5: Flow<T5>,
    transform: suspend (T1, T2, T3, T4, T5) -> R
): Flow<R> = combineUnsafe(flow, flow2, flow3, flow4, flow5) { args: Array<*> ->
    transform(
        args[0] as T1,
        args[1] as T2,
        args[2] as T3,
        args[3] as T4,
        args[4] as T5
    )
}
Run Code Online (Sandbox Code Playgroud)

这背后有什么特殊原因吗?(或者可能不是?)

如果我在本地文件中定义一个有6个参数的combine(),例如

private fun <T1, T2, T3, T4, T5, T6, R> combine(
    flow: Flow<T1>,
    flow2: Flow<T2>,
    flow3: Flow<T3>, …
Run Code Online (Sandbox Code Playgroud)

coroutine kotlin kotlin-coroutines kotlin-flow

21
推荐指数
2
解决办法
5261
查看次数

无法解析Android中的符号repeatOnLifecycle

我正在按照这篇文章收集 UI 中的流量。但我无法解析代码中的repeatOnLifeCycle API。不过,我添加了以下依赖项。

lifecycle:lifecycle-runtime-ktx:2.4.0-alpha03
Run Code Online (Sandbox Code Playgroud)

请帮忙在此输入图像描述

android kotlin-extension android-ktx androidx kotlin-flow

21
推荐指数
3
解决办法
9682
查看次数

Flow 类不需要类型参数

我在使用 Kotlin Flow 时遇到了问题。

我从官方指南中复制了以下代码

fun simple(): Flow<Int> = flow { 
    for (i in 1..3) {
        delay(100) 
        emit(i) 
    }
}
Run Code Online (Sandbox Code Playgroud)

但Android Studio提示如下错误:

Flow 类不需要类型参数

我究竟做错了什么?

kotlin kotlin-coroutines kotlin-flow

21
推荐指数
1
解决办法
7678
查看次数

收到 kotlin 错误“等待 60000 毫秒后,测试协程未完成”

我是测试新手,试图获取第二个流量值并断言它,当我逐个运行此测试时运行良好,但是当我运行整个测试时,第一个测试运行良好,其余测试给我超时错误。

错误 :

After waiting for 60000 ms, the test coroutine is not completing
kotlinx.coroutines.test.UncompletedCoroutinesError: After waiting for 60000 ms, the test coroutine is not completing
    at app//kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt$runTestCoroutine$3$3.invokeSuspend(TestBuilders.kt:304)
    (Coroutine boundary)
Run Code Online (Sandbox Code Playgroud)
@OptIn(ExperimentalCoroutinesApi::class)
class HomeViewModelTest {

    private lateinit var viewModel: HomeViewModel
    private val testDispatcher = UnconfinedTestDispatcher()

    @Before
    fun setup() {
        viewModel = HomeViewModel(FakeOrderRepository())
        Dispatchers.setMain(testDispatcher)
    }

    @After
    fun tearDown() {
        Dispatchers.resetMain()
        testDispatcher.cancel()
    }

    @Test
    fun flowViewModelTesting1() = runTest {
        val result = viewModel.homeUiState.drop(1).first()
        assertThat(true).isTrue()
    }


    @Test
    fun flowViewModelTesting2() = runTest {
        val result …
Run Code Online (Sandbox Code Playgroud)

android kotlin kotlin-coroutines kotlin-flow

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

类型不匹配推断的类型是 () -&gt; Unit 但预期 FlowCollector&lt;Int&gt;

当试图从 Flow 中收集时,类型突然不匹配,它正在工作,然后突然启动。

在我的视图模型中:

class MyViewModel: ViewModel() {

    lateinit var river: Flow<Int>

    fun doStuff() {
        river = flow {
            emit(1)
        }.flowOn(Dispatchers.Default)
        .catch {
            emit(0)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在我的活动中,我有以下内容:

lifecycleScope.launch {
    viewModel.river.collect { it ->
        // this whole collect is what has the error. 
    }
}
Run Code Online (Sandbox Code Playgroud)

collect给出了错误:Type mismatch: inferred type is () -> Unit but FlowCollector<Int> was expected

这怎么会发生?

android kotlin kotlin-coroutines kotlin-flow

20
推荐指数
2
解决办法
1532
查看次数

将两个状态流组合成新的状态流

我有两个状态流。是否有可能将它们结合起来并获得新的状态流?从逻辑上讲,这应该是可能的,因为两个状态流都有初始值,但正如我所见,组合函数仅返回 Flow 而不是 StateFlow。

collections kotlin kotlin-flow

20
推荐指数
2
解决办法
2万
查看次数