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

Flutter集成Agora UIKit视频通话持续加载故障排查求助

问题分析与修复方案

你的代码存在几个关键问题导致视频通话一直处于加载状态:

  1. 未初始化Agora客户端并加入频道:创建了AgoraClient实例,但没有触发连接流程,Agora UIKit不会自动完成频道加入操作。
  2. 加载状态控制不可靠:用固定1秒延迟关闭加载,无法保证token请求、客户端初始化完成,可能出现加载提前结束但客户端尚未就绪的情况。
  3. 缺乏错误处理:未处理token请求失败的场景,若token获取失败会直接导致客户端初始化异常。

修复后的代码

import 'dart:convert';
import 'package:agora_uikit/agora_uikit.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';

class VideoCall extends Stateful Widget {
  final String channelName;

  VideoCall({required this.channelName});
  @override
  _VideoCallState createState() => _VideoCallState();
}

class _VideoCallState extends State<VideoCall> {
  late AgoraClient _client;
  bool _loading = true;
  String tempToken = "";

  @override
  void initState() {
    super.initState();
    _initVideoCall();
  }

  Future<void> _initVideoCall() async {
    try {
      // 获取Token
      final link = "http://agora-node-tokenserver-1.dianagil2.repl.co/access_token?channelName=${widget.channelName}";
      final response = await get(Uri.parse(link));
      
      if (response.statusCode != 200) {
        throw Exception("Token请求失败,状态码:${response.statusCode}");
      }

      final data = jsonDecode(response.body);
      tempToken = data["token"];

      // 初始化Agora客户端
      _client = AgoraClient(
        agoraConnectionData: AgoraConnectionData(
          appId: "a936e47b75744dbf892ff34345001530",
          tempToken: tempToken,
          channelName: widget.channelName,
        ),
        enabledPermission: [Permission.camera, Permission.microphone],
      );

      // 执行客户端初始化(包含权限请求和频道连接)
      await _client.initialize();
    } catch (e) {
      // 错误提示
      if (mounted) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text("初始化失败:$e")),
        );
      }
    } finally {
      // 统一关闭加载状态
      if (mounted) {
        setState(() => _loading = false);
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: _loading
            ? const Center(child: CircularProgressIndicator())
            : Stack(
                children: [
                  AgoraVideoViewer(client: _client),
                  AgoraVideoButtons(client: _client),
                ],
              ),
      ),
    );
  }
}

关键改动说明

  • 整合初始化流程:新增_initVideoCall方法,把token获取、客户端初始化、错误处理整合到一起,逻辑更清晰。
  • 调用_client.initialize():这是触发Agora连接的核心步骤,会自动完成权限请求、频道加入操作,没有这一步客户端不会建立连接。
  • 替换固定延迟:用finally块在初始化完成(或失败)后关闭加载状态,确保状态更新时机准确。
  • 增加Token有效性检查:通过响应状态码判断token请求是否成功,避免解析无效数据导致后续流程崩溃。

额外排查点

  • 确认Token服务器返回的token与appId、channelName完全匹配,不匹配会直接导致连接失败。
  • 检查设备的摄像头、麦克风权限是否已授予,可在系统设置中确认。
  • 确保测试设备处于网络环境良好的状态,Agora需要稳定的网络支撑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:53:38