setOnMenuItemClickListener 只执行一次

setOnMenuItemClickListener executes only once

  invite.setOnMenuItemClickListener {
        drawerLayout.closeDrawer(GravityCompat.START)
        mainViewModel.executeInvite(
            InviteBody(
                Constants.apiKey,
                Constants.apiPass,
                Constants.apiInviteService
            )
        )
        true
    }

由于函数mainViewModel.executeInvite被调用,监听器只执行一次

下面的executeInvite是一个使用协程的函数:

fun executeInvite(inviteBody: InviteBody) {
    viewModelScope.launch {

如果我删除这段代码,一切都会完美无缺。

邀请是侧边菜单中的一个项目,点击后从后端生成动态 link。

If I remove this piece of code, everything works perfectly.

所以你告诉我如果你把

invite.setOnMenuItemClickListener {
    drawerLayout.closeDrawer(GravityCompat.START)
    Log.d("asdf", "hello")
    true
}

executeInvite 中,然后按 3 次邀请菜单项,您会看到 3 条日志语句说“你好”?如果是这样,那么您的侦听器应该是正确的,错误发生在 executeInvite 正在执行的代码中的某处。

如果是这种情况,您可以通过执行以下操作来调试它:

fun executeInvite(inviteBody: InviteBody) {
    viewModelScope.launch {
        runCatching { /* whatever code you're doing */ }
            .onSuccess { Log.d("asdf", "successful!") }
            .onFailure { throwable -> Log.d("asdf", "failure!", throwable) }
    }
}

所以对于所有遭受此痛苦的人

我设法通过创建 DialogFragment 并从菜单点击侦听器调用它来解决这个问题。代码如下:

 invite.setOnMenuItemClickListener {
        drawerLayout.closeDrawer(GravityCompat.START)
        InviteDialogFragment().show(
            supportFragmentManager, Constants.apiInviteService)
        true
    }

Invite Fragment 中有另一个视图模型,它会调用 API 并观察那里的结果。出于某种原因,从 onMenuCLickListener 调用 API 导致视图级别出现异常,导致导航项的所有其他项都无法点击。