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

Flutter集成agora_rtc_engine 4.0.7首次视频通话本地摄像头失效

问题根因
  • 引擎初始化及加入频道为异步逻辑,执行完成晚于页面首帧渲染,且加入频道成功后未调用setState触发UI重绘,导致依赖引擎实例的本地预览视图无法正常渲染。
  • initForAgora方法内存在冗余的getAgoraToken调用,initState中已经完成token拉取校验后才触发initForAgora,二次调用会引发不必要的网络请求,甚至出现时序异常。
  • 通话结束后仅执行了离开频道操作,未销毁RtcEngine实例,第二次进入通话时复用了已完成初始化的引擎实例,所以预览正常,这也是首次异常、二次正常的核心原因。
修复方案

步骤1:补充加入频道成功后的UI刷新逻辑

修改RtcEngineEventHandler中的joinChannelSuccess回调,触发状态更新:

joinChannelSuccess: (String channel, int uid, int elapsed) async {
  print("本地用户 $uid 已加入频道");
  setState(() {
    isJoined = true;
  });
},

步骤2:删除冗余的token拉取调用

删除initForAgora方法末尾重复的getAgoraToken调用:

// 移除该行 await getAgoraToken();
await _engine?.joinChannel(token, channelName!, null, userDetails.id!);

步骤3:补充通话结束后的引擎销毁逻辑

在所有退出通话的路径(主动挂断、返回键退出、远端用户离开触发退出)中,leaveChannel后补充引擎销毁代码:

await _engine?.leaveChannel();
// 新增销毁逻辑
await _engine?.destroy();
_engine = null;

步骤4(可选优化):本地预览增加状态校验

避免引擎未就绪时空渲染,修改_renderLocalPreview方法:

Widget _renderLocalPreview() {
  if (_engine == null || !isJoined) {
    return const Center(
      child: CircularProgressIndicator(color: Colors.white),
    );
  }
  return RtcLocalView.SurfaceView();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:39:02