android - SharedFlow 不从发射中收集

标签 android kotlin kotlin-coroutines kotlin-flow kotlin-sharedflow

在我的 ViewModel 中,我发出 API 请求并使用 StateFlowSharedFlow 与 fragment 通信。在发出 API 请求时,我可以轻松地更新状态流的值并成功收集到 fragment 中。

但在发出请求之前,我使用 SharedFlow 发出了一些 bool 值,并且它没有被收集到 Fragment 中。谁能帮我看看为什么会这样?

class MainViewModel: ViewModel() {
  private val _stateFlow = MutableStateFlow(emptyList<Model>())
  val stateFlow = _stateFlow.asStateFlow()

  private val _loading = MutableSharedFlow<Boolean>()
  val loading = _loading.asSharedFlow()

  suspend fun request() {
    _loading.emit(true)
    withContext(Dispatchers.IO) {
      /* makes API request */
      /* updates _stateFlow.value */
      /* stateFlow value is successfully collected */
    }
    _loading.emit(false) // emitting boolean value
  }
}
class MyFragment : Fragment(R.layout.fragment_my) {
   // ...

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    lifecycleScope.launchWhenStarted {
      viewModel.request()
      /* stateFlow is collected and triggered - working properly */

      viewModel.loading.collectLatest { // <- NOT COLLECTING - WHY?
        Log.d(this::class.simpleName, "onViewCreated: $it") // <- NOT LOGGING
      }
    }
  }
}

最佳答案

SharedFlow 是一个热门流。也许你应该创建它

MutableSharedFlow(
    replay = 0,
    onBufferOverflow = BufferOverflow.DROP_OLDEST,
    extraBufferCapacity = 1
)

MutableSharedFlow(
    replay = 1,
    onBufferOverflow = BufferOverflow.DROP_OLDEST
)

关于android - SharedFlow 不从发射中收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71734781/

相关文章:

android - 如何处理 jetpack compose 中 popBackStack() 的多次点击

kotlin - 从多个Kotlin协程暂停功能到单个同步功能

kotlin - 如何替换 Kotlin 中读取字节的阻塞代码

kotlin-coroutines - kotlin协程,coroutineScope和withContext有什么区别

kotlin-coroutines - 如何从挂起方法调用 Observable 并等待结果

android - 如何使用 ADB 判断屏幕是否打开

android - 桌面模式 android WebView 不起作用,为什么?

Android Facebook Flutter 登录崩溃应用程序

android - 使用 Parse Cloud 插入镜像对象

android - 类不是抽象的/Activity 不能被实例化