我是 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
}
}
那么,如何做到不让小吃店在存在时阻止输入?
我试过像其他人从谷歌搜索中说的那样在其他调度员中运行它们,但没有任何效果。 我只是不知道这里正确的方法是什么。