我有一些关于Kotlin Flow 的问题
LiveData从多个 Fragment观察。我可以这样做Flow吗?如果是,那么如何?LiveData从单个中获得多个。有没有办法从一个来源获得多个?LiveDatamapswitchMapFlowFlowMutableLiveDataI 可以使用变量引用从任何地方更新数据。有什么办法可以做同样的事情Flow吗?我有一个用例,例如:我将观察一个SharedPreferencesusing callbackFlow{...},它会给我一个单一的源 Flow。从那个 Flow 中,我想为每个键值对创建多个 Flow。
这些可能听起来很愚蠢的问题。我是 Rx 和 Flow 世界的新手。
android kotlin android-livedata kotlin-coroutines kotlin-flow
我想知道他们俩的实际场景。我知道其中的区别,但无法与我的实现联系起来。
我遇到过建议切换到 StateFlow 的文章。就像这里的那个一样。同样在新的 Android studio 中,StateFlow 支持自动包含在数据绑定功能中,包括协程依赖项。实时数据已在大多数应用程序中使用。我们应该从 LiveData 迁移到 StateFlow 吗?有什么好处?
android android-livedata kotlin-flow kotlin-stateflow android-studio-arctic-fox
以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) 我注意到,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) 我正在按照这篇文章收集 UI 中的流量。但我无法解析代码中的repeatOnLifeCycle API。不过,我添加了以下依赖项。
lifecycle:lifecycle-runtime-ktx:2.4.0-alpha03
Run Code Online (Sandbox Code Playgroud)
请帮忙
我在使用 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 类不需要类型参数
我究竟做错了什么?
我是测试新手,试图获取第二个流量值并断言它,当我逐个运行此测试时运行良好,但是当我运行整个测试时,第一个测试运行良好,其余测试给我超时错误。
错误 :
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) 当试图从 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。
这怎么会发生?
我有两个状态流。是否有可能将它们结合起来并获得新的状态流?从逻辑上讲,这应该是可能的,因为两个状态流都有初始值,但正如我所见,组合函数仅返回 Flow 而不是 StateFlow。