You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter集成Agora SDK视频通话:接收方点击endCall无法退出页面问题

通话异常排查与解决方案

这个问题本质是双端endCall的执行链路不对称——呼叫方端的退出逻辑全链路打通,接收方端的退出流程存在代码断点,和Agora SDK本身的能力无关,可按以下步骤逐层排查定位:

  • 优先检查接收方endCall按钮的逻辑绑定是否存在阻塞
    很多开发者会把页面退出逻辑绑定在Agora SDK的leaveChannel回调上,而非按钮点击事件中同步执行。如果代码中对leaveChannel的回调做了身份判断,比如仅当当前用户为呼叫方时才触发页面弹出逻辑,接收方身份下的回调分支会被直接过滤,自然无法自动关闭页面。
    错误写法参考:
    // 阻塞式错误逻辑
    onEndCallTap: () async {
      await agoraEngine.leaveChannel();
      Navigator.pop(context);
    }
    
    这里如果leaveChannel的调用因为权限、通道状态问题没有正常返回回调,后续的Navigator.pop就永远不会执行。
    正确的逻辑优先级应该是:用户点击endCall的瞬间,优先同步执行本地通话页的关闭操作,再异步执行SDK资源释放、对方结束通知等逻辑,不阻塞用户操作反馈:
    // 无阻塞正确逻辑
    onEndCallTap: () {
      // 第一时间关闭页面,保证操作即时响应
      Navigator.pop(context);
      // 后续逻辑异步执行,不影响页面关闭
      _cleanupCallResources();
    }
    
  • 排查身份判断分支的覆盖完整性
    检查所有endCall相关的判断逻辑,是否存在仅给呼叫方配置退出分支的问题。比如部分代码会写类似if (currentUser.isCaller) { 执行页面退出、状态重置逻辑 },完全没有覆盖接收方的执行分支,导致接收方点击按钮时,代码走到身份判断后直接跳过所有退出操作,只能等待呼叫方点击结束按钮、发来结束信令后,才会触发本地退出流程,和当前的异常表现完全匹配。
  • 检查是否存在依赖远端响应才执行本地退出的逻辑
    如果接收方端的代码设计为必须等服务端返回endCall接口的成功ACK后,才执行本地页面关闭,而服务端仅对呼叫方的endCall请求配置了响应、直接丢弃接收方的结束请求,本地的等待逻辑就会一直挂起,造成页面无法关闭的假象。
    要明确一个设计原则:本地页面的关闭是用户端的最高优先级操作,不依赖任何远端服务的响应结果。不管对方是否成功收到结束通知,用户点击退出按钮后就应该第一时间看到通话页消失,后续的通话记录同步、对方状态通知、计费统计都应该在后台异步执行,不能阻塞用户操作。
  • 排查路由栈的阻塞问题
    检查接收方端的通话页入栈方式,如果通话页是通过push压栈的全屏页面,退出时如果使用了popUntil的栈遍历逻辑,很容易因为栈条件判断不匹配导致无法正常出栈。呼叫方因为入栈路径和接收方存在差异,可以正常满足出栈条件,接收方则会卡在栈内,直到呼叫方触发的全局状态变更清理了路由栈,才能正常退出。

快速定位技巧:在接收方点击endCall的代码最开头添加断点/日志,逐行看日志的执行中断位置,是根本没走到页面弹出逻辑,还是弹出逻辑执行了但路由没有生效,基本可以快速定位问题根因。

内容的提问来源于stack exchange,提问作者Yahya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 20:45:01