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
相关产品推荐
相关产品推荐

