【问题标题】:MutableStateFlow collector doesn't receive dataMutableStateFlow 收集器不接收数据
【发布时间】:2021-11-21 05:12:38
【问题描述】:

我有一些视图模型:

    private val locationFlow = locationProviderClient.locationFlow(LocationModule.locationRequest)

    val position = MutableStateFlow(Location(LocationManager.NETWORK_PROVIDER))
    val positions = MutableStateFlow(emptyList<Position>())

    init {
        collectLocation()
    }

    private fun collectLocation() {
        viewModelScope.launch {
            locationFlow.collect {
                position.value = it
                positions.value = positionService.updateLocation(it.toPosition())
            }
        }
    }

当前位置的初始化流程正在启动。在每个新值上,最后一个位置应该被发送到position 状态流中,并且应该执行网络请求。 这是负责收集状态流的片段代码

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        lifecycleScope.launchWhenStarted {
                ...
                viewModel.positions.collect(updateMarkers)
                viewModel.position.collect(updateCamera)
                ...
            }
    }

现在,当片段开始位置发出时,两个流都会更新,请求是发送 updateMarkers 被调用但 updateCamera 不是。

我想有一些微妙的错误,如果没有谁能告诉我我到底做错了什么?

【问题讨论】:

  • updateCamera 功能在哪里?
  • collect 是一个挂起函数,你应该在不同的协程中调用它(启动)
  • @charlie.7 private val GoogleMap.updateCamera: suspend (Location) -&gt; Unit get() = { animateCamera(CameraUpdateFactory.newLatLngZoom(it.toLatLng(), ZOOM_STREETS)) } 它工作正常,但是 - 但没有被调用
  • 从主线程调用
  • @IR42 你是对的 - 它有帮助。你会添加答案吗?

标签: android kotlin android-viewmodel flow


【解决方案1】:

您的两个流的收集不是并发的,它们仍然按顺序执行。


override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        lifecycleScope.launch(Dispatchers.IO) {
                ...
                viewModel.positions.collect(updateMarkers)
                ...
            }

        lifecycleScope.launch(Dispatchers.IO) {
                ...
                viewModel.position.collect(updateCamera)
                ...
            }
    }

【讨论】:

    【解决方案2】:

    如果你正在更新 UI,它应该从主线程调用

    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            lifecycleScope.launch(Dispatchers.IO) {
                    ...
                    viewModel.positions.collect(updateMarkers)
                    viewModel.position.collect(updateCamera)
                    ...
                }
        }
    

    【讨论】:

      猜你喜欢
      • 2021-03-30
      • 2021-04-18
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 2018-08-18
      • 1970-01-01
      相关资源
      最近更新 更多