如何在 ViewModel init 函数中正确发送 Activity 启动时的 ViewModel 事件?

问题描述 投票:0回答:1

我希望在创建活动后打开相机屏幕。当我在 ViewModel init 函数中发送触发相机的事件时,什么也没有发生:

ViewModel 初始化函数:

init{
  viewModelScope.launch {
                _eventFlow.emit(
                    UiEvent.TakePhoto
                )
            }
}

Activity中触发相机的函数:

  override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

      lifecycleScope.launch {
            lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED)
            {
                viewModel.eventFlow.collectLatest { event ->
                    when(event){
                        is PhotoViewModel.UiEvent.TakePhoto ->
                        {
                            takePhoto()
                        }
                    }
                }
            }
        }
    }

 private fun takePhoto()
    {
        val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        resultLauncher.launch(cameraIntent)
    }

但是当我在 init 函数中添加延迟时,它就起作用了:

init{
  viewModelScope.launch {

                    delay(1000)

                _eventFlow.emit(
                    UiEvent.TakePhoto
                )
            }
}

有没有更正确的解决方案?

android camera viewmodel init
1个回答
0
投票

使用

collect
而不是
collectLatest
可确保处理每次发射,并且由于创建 ViewModel 后仅立即发生一次发射,因此可确保收集完成而不会被取消。

       lifecycleScope.launch {
            lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) {
                mainViewModel.takePhotoEvent.collect {
                    takePhoto()
                }
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.