我希望在创建活动后打开相机屏幕。当我在 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
)
}
}
有没有更正确的解决方案?
使用
collect
而不是 collectLatest
可确保处理每次发射,并且由于创建 ViewModel 后仅立即发生一次发射,因此可确保收集完成而不会被取消。
lifecycleScope.launch {
lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) {
mainViewModel.takePhotoEvent.collect {
takePhoto()
}
}
}