为什么显示此小吃栏会阻止任何其他点击输入?

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

我是 Android 开发的新手,遵循 YouTube 上的教程并发送此 UI 事件(显示小吃店)会阻止任何其他输入,直到它被关闭。 因为它是从 viewModelScope 启动的,所以它不应该允许任何其他事件吗?

这是视图模型

@HiltViewModel
class TodoListViewModel @Inject constructor(
    private val todoRepository: TodoRepository
) : ViewModel() {
    val todos = todoRepository.getAllTodos()
    private val _uiEvent = Channel<UiEvent>()
    val uiEvent = _uiEvent.receiveAsFlow()
    private var deletedTodo: Todo? = null

    fun onEvent(event: TodoListEvent) {
        when (event) {
            is TodoListEvent.OnTodoClick -> {
                sendUiEvent(UiEvent.Navigate(Routes.ADD_TODO + "?todoId=${event.todo.id}"))
            }
            is TodoListEvent.OnAddTodoClick -> {
                sendUiEvent(UiEvent.Navigate(Routes.ADD_TODO))
            }
            is TodoListEvent.UpdateTodoStatus -> {
                viewModelScope.launch {
                    todoRepository.upsert(event.todo.copy(isCompleted = event.isCompleted))
                }
            }
            is TodoListEvent.DeleteTodo -> {
                viewModelScope.launch {
                    todoRepository.delete(event.todo)
                    deletedTodo = event.todo
                    sendUiEvent(UiEvent.ShowSnackbar("Todo deleted", action = "Undo"))
                }
            }
            is TodoListEvent.OnUndoDelete -> {
                deletedTodo?.let {
                    viewModelScope.launch {
                        todoRepository.upsert(it)
                    }
                }
            }
        }
    }

    private fun sendUiEvent(uiEvent: UiEvent) {
        viewModelScope.launch(Dispatchers.Default) {
            _uiEvent.send(uiEvent)
        }
    }
}

UI部分

val todos = viewModel.todos.collectAsState(initial = emptyList())
    val scaffoldState = rememberScaffoldState()

    LaunchedEffect(key1 = true) {
        viewModel.uiEvent.collect { event ->
            when (event) {
                is UiEvent.ShowSnackbar -> {
                    val result = scaffoldState.snackbarHostState.showSnackbar(
                        message = event.message,
                        actionLabel = event.action,
                    )
                    if (result == SnackbarResult.ActionPerformed)
                        viewModel.onEvent(TodoListEvent.OnUndoDelete)
                }
                is UiEvent.Navigate -> onNavigate(event)
                else -> Unit
            }
        }

那么,如何做到不让小吃店在存在时阻止输入?

我试过像其他人从谷歌搜索中说的那样在其他调度员中运行它们,但没有任何效果。 我只是不知道这里正确的方法是什么。

android mvvm android-jetpack-compose kotlin-coroutines android-viewmodel
© www.soinside.com 2019 - 2024. All rights reserved.