Flutter集成agora_rtc_engine通话时随机出现errInvalidToken问题求助
Flutter集成Agora RTC Token无效/过期问题解决方案
从你提供的错误日志ErrorCodeType.errInvalidToken可以确定,问题确实出在Token的生命周期管理上。以下是具体的实现方案:
核心思路
Agora Token存在有效期限制,必须在过期前主动刷新,或在Token失效后重新获取并重新加入频道,才能避免通话中出现随机断连/错误的情况。
具体实现步骤
1. 监听Token相关回调
初始化Agora引擎时,注册三个关键回调来处理Token的有效期问题:
RtcEngine.createWithConfig(RtcEngineConfig(appId)).then((engine) { _engine = engine; _engine.setEventHandler(RtcEngineEventHandler( // Token即将过期(默认提前30秒触发),主动刷新Token onTokenPrivilegeWillExpire: (String oldToken) async { final newToken = await _fetchNewToken(); _engine.renewToken(newToken); }, // Token已失效,需要重新获取并加入频道 onRequestToken: () async { final newToken = await _fetchNewToken(); await _engine.leaveChannel(); await _engine.joinChannel(newToken, channelName, null, uid); }, // 捕获Token无效错误,被动处理 onError: (ErrorCodeType err, String msg) async { if (err == ErrorCodeType.errInvalidToken) { final newToken = await _fetchNewToken(); await _engine.leaveChannel(); await _engine.joinChannel(newToken, channelName, null, uid); } }, )); });
2. 实现后端Token生成调用
前端需要调用后端接口动态获取新Token,绝对不能在前端硬编码Agora证书:
Future<String> _fetchNewToken() async { // 替换为你的后端API地址,传入频道名和用户ID final response = await http.post( Uri.parse('你的后端Token生成接口地址'), body: { 'channel_name': channelName, 'uid': uid.toString(), }, ); if (response.statusCode == 200) { return json.decode(response.body)['token']; } else { throw Exception('获取新Token失败'); } }
3. 关键注意事项
- 后端生成规则:后端必须使用Agora提供的SDK,结合App ID、App Certificate、频道名、UID生成Token,确保参数和前端完全一致。
- 临时测试方案:开发阶段可使用Agora控制台生成临时Token,但生产环境必须用后端动态生成。
- 避免缓存过期Token:每次加入频道前,都要确认Token的有效性,不要复用过期的Token。
内容的提问来源于stack exchange,提问作者Abhisek Nayak
相关产品推荐
相关产品推荐

