Flutter

最近更新时间:2025-09-02 16:57:22

我的收藏
腾讯云实时互动-教育版(原低代码互动课堂 LCIC)是一款集成音视频连麦、互动白板和直播等多功能的产品,能够帮助您节省90%的开发工作。在教育、医疗、金融和企业培训等领域,可快速搭建一对一教学、互动小班课、直播大班课和直播带货等多种互动直播业务场景。
TCIC Client 是一个包含 LCIC 所有功能的 Flutter 插件,您可以通过该插件快速集成 LCIC 功能,实现互动直播、互动白板、音视频连麦等功能。

TCIC Client



支持平台

Android (API 21+)
iOS (12.0+)

环境要求

Flutter 环境

Flutter SDK:≥ 1.17.0
Dart SDK:^3.7.0

Android 环境

Android SDK:API 21+ (Android 5.0及以上)
NDK:27.0.12077973+
Java:11+
Kotlin:支持

iOS 环境

iOS: 12.0+
Xcode: 14.0+
CocoaPods: 1.12.0+

在线 Demo

单击查看 Demo 地址

前置准备

在使用 TCIC Client 前,您需要先完成以下前置准备。

步骤一:创建新的应用

1. 登录 实时互动-教育版控制台,进入左侧导航栏的概览,单击新建应用
2. 若尚未创建应用,则默认进入"创建应用"界面,输入应用名称,例如 TestLCIC。

若您已创建应用,可前往 应用管理 中,选择使用已有应用即可。



说明:
每个账号可免费领用一个试用版应用,若需创建商用应用,可根据业务需求在 购买页 创建对应版本的应用。应用名称只允许下划线、数字或中英文字符。

步骤二:获取 SDKAppId 和密钥(SecretKey)

1. 进入 应用管理 > 应用配置,获取应用 ID(SDKAppId)。
2. 进入 访问管理(CAM)控制台 获取密钥,若无密钥,需要在 API 密钥管理中新建,具体可参见 访问密钥管理




步骤三:获取进入课堂所需参数

1. 通过调用云 API 接口 RegisterUser 注册用户,可以获取到对应的用户 ID(userid)信息。
2. 通过云 API 接口 LoginUser 登录,可以获取到用户鉴权 token 信息。
3. 通过云 API 接口 CreateRoom 创建课堂,可以获取到课堂号(classid)信息。
字段
类型
必填
含义
备注
userid
string
用户名。
通过 RegisterUser 接口获取。
classid
string
课堂 ID。
通过 CreateRoom 接口创建返回获取。
token
string
后台鉴权参数。
通过 LoginUser 接口获取。
role
string
进入课堂角色,默认空。
可选参数 supervisor(巡课/内容审查) ,只有已注册应用内巡课用户才有权限。
lng
string
语言参数,默认 zh-CN。
当前支持中文(简体)、中文(繁体) 、English、韩语、日语、阿拉伯语、越南语。可拼接相应参数,展示对应语种。参数:zh-CN、zh-TW、en-US、ka、ja、ar、vi。
location
boolean
是否上报经纬度位置信息。
默认 false 不上报。
layout
string
页面布局。
默认顶部布局(top),当前仅视频文档模式有效,支持双排布局(double)、右侧布局(right)、左侧布局(left)、三分布局(three)。
boardColor
string
白板颜色。
白板颜色设置,默认为:#182E25 ,支持 Hex 格式,也支持 rgba(0, 0, 0, .3)设置。
noEndClass
boolean
禁用下课。
助教进房时带上这个参数,在助教点击退出时,将隐藏「下课」,仅展示「离开」按钮。

快速跑通

安装依赖

在您的 Flutter 项目中执行flutter pub add tcic_client_ui 安装依赖。

权限相关配置

在教学场景中,通常我们会用到音视频互动,屏幕共享等功能,因此需要应用配置对应的权限。

Android 配置

1. 权限配置
android/app/src/main/AndroidManifest.xml 中添加以下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
2. 屏幕录制配置
添加屏幕录制辅助 Activity:
<activity
android:name="com.tencent.rtmp.video.TXScreenCapture$TXScreenCaptureAssistantActivity"
android:theme="@android:style/Theme.Translucent"/>
3. build.gradle 配置
android/app/build.gradle.kts 中配置:
1. ndkVersion 版本设置为 27.0.12077973
2. 配置packagingOptions解决 so 文件冲突问题。
android {
namespace = "com.tencent.tcic"
compileSdk = flutter.compileSdkVersion
ndkVersion = "27.0.12077973"
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_11.toString()
}
defaultConfig {
applicationId = "com.tencent.tcic"
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
}
// 解决重复so文件冲突
packagingOptions {
pickFirst("lib/arm64-v8a/libliteavsdk.so")
pickFirst("lib/armeabi-v7a/libliteavsdk.so")
pickFirst("lib/x86/libliteavsdk.so")
pickFirst("lib/x86_64/libliteavsdk.so")
}
}
4. 混淆配置
android/app/proguard-rules.pro 中添加:
# 腾讯云SDK混淆配置
-keep class com.tencent.** { *; }
-keep class com.tencent.rtc.** { *; }
-keep class com.tencent.liteav.** { *; }
-keep class com.tencent.trtc.** { *; }
-keep class com.tencent.imsdk.** { *; }
-keep class com.tencent.tls.** { *; }

# Flutter相关
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }

iOS 配置

1. 权限配置
ios/Runner/Info.plist 中添加以下权限描述:
<!-- 相机权限 -->
<key>NSCameraUsageDescription</key>
<string>Video calls require camera permission.</string>

<!-- 麦克风权限 -->
<key>NSMicrophoneUsageDescription</key>
<string>Voice calls require microphone permission.</string>

<!-- 网络配置 -->
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

<!-- 后台模式 -->
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
</array>

<!-- 屏幕录制扩展 -->
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.tencent.comm.tcic.sharescreen</string>
</array>

跑通代码

配置完权限相关后,在前置条件中您了创建应用并且已经获取到了必要的classId,userId,token参数,只要将这些参数传入到组件中使用即可。
import 'package:tcic_client_ui/tcic_client_ui.dart';
import 'package:tcic_client_ui/controller/tcic_contoller.dart';
import 'package:tcic_client_ui/utils/model/enum/role_enum.dart';
import 'package:tcic_client_ui/utils/model/tcic_cofig_model.dart';

// 创建控制器
final controller = TCICController();

// 配置参数
final config = TCICConfig(
userId: 'user123', /// 前置条件步骤中注册用户使用的用户id
classId: 'class456', /// 前置条件步骤中创建的课堂id
role: RoleEnum.student,
token: 'your_token_here', /// 前置条件步骤中登录用户获取的token
// 可选参数
isTestBackend: false, /// 是否使用后台测试环境
);

// 根据您的业务场景,跳转到课堂页面
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => TCICView(
controller: controller,
config: config,
),
),
);
通过上述步骤您已经成功集成了课堂组件,您可以在您的应用中使用该组件来实现课堂功能。

跨应用屏幕共享

iOS 系统上的跨应用屏幕分享,需要增加 Extension 录屏进程以配合主 App 进程进行推流。Extension 录屏进程由系统在需要录屏的时候创建,并负责接收系统采集到屏幕图像。因此需要:
1. 创建 App Group,并在 Xcode 中进行配置(可选)。这一步的目的是让 Extension 录屏进程可以同主 App 进程进行跨进程通信。
2. 在您的工程中,新建一个 Broadcast Upload Extension 的 Target,并在 GitHub 中获取专门为扩展模块定制的 TXLiteAVSDK_ReplayKitExt.framework
注意:
如果跳过步骤1(即不配置 App Group,接口传 null),屏幕分享依然可以运行,但稳定性会有所降低。因此,尽管步骤较多,建议尽量配置正确的 App Group 以保障屏幕分享功能的稳定性。

步骤1:创建 App Group

使用您的账号登录 Apple Developer,按以下步骤操作。
注意:
完成后需要重新下载对应的 Provisioning Profile。
1. 单击左侧的 Certificates, IDs & Profiles
2. 在右侧的界面中单击加号。
3. 选择 App Groups,单击 Continue
4. 在弹出的表单中填写 Description 和 Identifier,其中 Identifier 需要传入接口中对应的 AppGroup 参数。完成后单击 Continue

5. 回到 Identifier 页面,在上边的菜单中选择 App IDs,然后单击您的 App ID(主 App 与 Extension 的 AppID 需要进行同样的配置)。
6. 选中 App Groups 并单击 Edit
7. 在弹出的表单中选择您之前创建的 App Group,单击 Continue 返回编辑页。然后,单击 Save 保存。

8. 重新下载 Provisioning Profile 并配置到 Xcode 中。

步骤2:创建 Broadcast Upload Extension

1. 在 Xcode 菜单依次单击 File > New > Target...,选择 Broadcast Upload Extension
2. 在弹出的对话框中填写相关信息,不用勾选 Include UI Extension,单击 Finish 完成创建。
3. 将下载到的 SDK 压缩包中的 TXLiteAVSDK_ReplayKitExt.framework 拖动到工程中,勾选刚创建的 Target。
4. 选中新增加的 Target,依次单击 + Capability,双击 App Groups,如下图:
AddCapability
AddCapability

操作完成后,会在文件列表中生成一个名为 Target.entitlements 的文件。如下图所示,选中该文件并单击 + 号填写上述步骤中的 App Group 即可。
AddGroup
AddGroup

5. 选中主 App 的 Target ,并按照上述步骤对主 App 的 Target 做同样的处理。
6. 在新创建的 Target 中,Xcode 会自动创建一个名为 "SampleHandler.swift" 的文件,用如下代码进行替换。需将代码中的 APPGROUP 改为上文创建的 App Group Identifier。
import ReplayKit
import TXLiteAVSDK_ReplayKitExt

let APPGROUP = "group.com.tencent.comm.tcic.sharescreen"

class SampleHandler: RPBroadcastSampleHandler, TXReplayKitExtDelegate {

let recordScreenKey = Notification.Name.init("TRTCRecordScreenKey")

override func broadcastStarted(withSetupInfo setupInfo: [String : NSObject]?) {
// 用户已请求开始直播。UI 扩展程序的设置信息可以通过ut optional.
TXReplayKitExt.sharedInstance().setup(withAppGroup: APPGROUP, delegate: self)
}

override func broadcastPaused() {
// 用户已请求暂停直播。
}

override func broadcastResumed() {
// 用户已请求恢复直播。
}

override func broadcastFinished() {
// 用户已请求结束广播。
TXReplayKitExt.sharedInstance() .finishBroadcast()
}

func broadcastFinished(_ broadcast: TXReplayKitExt, reason: TXReplayKitExtReason) {
var tip = ""
switch reason {
case TXReplayKitExtReason.requestedByMain:
tip = "屏幕共享已结束"
break
case TXReplayKitExtReason.disconnected:
tip = "应用断开"
break
case TXReplayKitExtReason.versionMismatch:
tip = "集成错误(SDK 版本号不相符合)"
break
default:
break
}

let error = NSError(domain: NSStringFromClass(self.classForCoder), code: 0, userInfo: [NSLocalizedFailureReasonErrorKey:tip])
finishBroadcastWithError(error)
}

override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) {
switch sampleBufferType {
case RPSampleBufferType.video:
// 处理视频样本缓冲区
TXReplayKitExt.sharedInstance() .sendVideoSampleBuffer(sampleBuffer)
break
case RPSampleBufferType.audioApp:
// 处理应用程序音频的音频样本缓冲区
break
case RPSampleBufferType.audioMic:
// 处理麦克风音频的音频样本缓冲区
break
@unknown default:
// 处理其他样本缓冲液类型
fatalError("未知类型")
}
}
}

参数说明

TCICView 组件参数

参数名
类型
是否必填
描述
controller
TCICController
控制器实例。
config
TCICConfig
配置信息。
callback
TCICCallback
回调函数。

TCICConfig 字段信息

字段名
类型
是否必填
描述
userId
String
用户 ID。
classId
String
课堂 ID。
token
String
认证令牌。
role
RoleEnum
用户角色(学生/老师等)。
langConfig
TCICLangConfig
语言配置。
nameConfig
TCICNameConfig
名称配置。
fontConfig
TCICFontConfig
字体配置。
liveplayerConfig
TCICLivePlayerConfig
直播播放器配置。
isLatestBackend
bool
是否使用最新后端。
isTestBackend
bool
是否使用测试后端。
componentConfig
List<TCICComponentConfig>
组件配置列表。

TCICComponentConfig 字段信息

TCICComponentConfig 是一个抽象类,用于配置课堂界面中的各个组件。通过将具体的组件配置类实例添加到 componentConfig 列表中,可以实现对各个组件的自定义配置。

组件配置使用示例

// 创建控制器
final controller = TCICController();

// 配置参数
final config = TCICConfig(
userId: 'user123',
classId: 'class456',
role: RoleEnum.student,
token: 'your_token_here',
// 组件配置列表
componentConfig: [
HeaderComponentConfig(
isShow: true,
enableHandsUp: true,
iconConfig: HeaderIconConfig(
micIcon: 'custom_mic_icon.png',
cameraIcon: 'custom_camera_icon.png',
),
),
MemebersComponentConfig(
enableStageUpDownAction: true,
),
MessageComponentConfig(),
SetttingComponentConfig(),
VideoComponentConfig(),
WhiteboardComponentConfig(),
],
);

// 根据您的业务场景,跳转到课堂页面
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => TCICView(
controller: controller,
config: config,
),
),
);


HeaderComponentConfig 字段信息

HeaderComponentConfig 用于配置头部组件,其字段信息如下:
字段名
类型
是否必填
描述
isShow
bool
是否显示头部组件(默认为 true)。
enableHandsUp
bool
是否显示举手(默认为 true)。
enableScreenShare
bool
是否显示屏幕共享(默认为 true)。
enableMessage
bool
是否显示消息(默认为 true)。
enableCourseware
bool
是否显示课件(默认为 true)。
enableSetting
bool
是否显示设置(默认为 true)。
enableMemberList
bool
是否显示花名册(默认为 true)。
showClassStatus
bool
是否显示课程状态(默认为 true)。
showClassTime
bool
是否显示课程时间(默认为 true)。
showOnlineMemberCount
bool
是否显示在线成员数量(默认为 true)。
showQuitButton
bool
是否显示退出按钮(默认为 true)。
showClassLogo
bool
是否显示课程 Logo(默认为 true)。
showClassName
bool
是否显示课程名称(默认为 true)。
showClassInfo
bool
是否显示课程信息(默认为 true)。
showNetworkStatus
bool
是否显示网络状态(默认为 true)。
iconConfig
HeaderIconConfig
自定义头部组件图标配置。
headerBuilder
Widget Function()
自定义整个头部组件。
headerLeftBuilder
Widget Function()
自定义头部组件左侧组件。
headerRightBuilder
Widget Function()
自定义头部组件右侧组件。
headerActionsBuilder
Widget Function()
自定义头部组件中间组件。

HeaderIconConfig 字段信息

HeaderIconConfig 用于配置头部组件的图标,其字段信息如下:
字段名
类型
是否必填
描述
micIcon
String
麦克风图标。
micDisableIcon
String
麦克风禁用图标。
cameraIcon
String
摄像头图标。
cameraDisableIcon
String
摄像头禁用图标。
handUpIcon
String
举手图标。
screenShareIcon
String
屏幕共享图标。
messageIcon
String
消息图标。
coursewareIcon
String
课件图标。
settingIcon
String
设置图标。
membersIcon
String
成员图标。

MemebersComponentConfig 字段信息

MemebersComponentConfig 用于配置成员组件,其字段信息如下:
字段名
类型
是否必填
描述
enableStageUpDownAction
bool
是否启用上下台(默认为 true)。

MessageComponentConfig 字段信息

MessageComponentConfig 用于配置消息组件,其字段信息如下:
字段名
类型
是否必填
描述
messageItemBuilder
Widget Function(V2TimMessage)
消息 Item 构建器。
messageHeaderBuilder
Widget Function(V2TimMessage)
消息头构建器。
messageBubbleBuilder
Widget Function(V2TimMessage, Widget)
消息气泡构建器。
messageRowBuilder
Widget Function(V2TimMessage)
消息行构建器。

SettingComponentConfig 字段信息

SettingComponentConfig 用于配置设置组件,其字段信息如下:
字段名
类型
是否必填
描述
enableAudioSetting
bool
是否启用音频设置(默认为 true)。
enableVideoSetting
bool
是否启用视频设置(默认为 true)。
enableGeneralSetting
bool
是否启用通用设置(默认为 true)。
showMemberJoinExitInfo
bool
是否显示成员加入退出课堂信息(默认为 true)。
showMemberhandsupInfo
bool
是否显示成员举手信息(默认为 true)。

VideoComponentConfig 字段信息

VideoComponentConfig 用于配置视频组件,其字段信息如下:
字段名
类型
是否必填
描述
videoFloatBuilder
Widget Function()
视频悬浮层构建器。
videoActionBuilder
Widget Function()
视频组件操作按钮构建器。

WhiteboardComponentConfig 字段信息

WhiteboardComponentConfig 用于配置白板组件,其字段信息如下:
字段名
类型
是否必填
描述
enableCreateBoard
bool
是否启用创建白板(默认为 true)。
enableBoardList
bool
是否启用白板列表(默认为 true)。
enableSwitchPage
bool
是否 PPT 课件可翻页(默认为 true)。

TCICLangConfig 字段信息

TCICLangConfig 用于配置语言信息,其字段信息如下:
字段名
类型
是否必填
描述
lang
TranslateLangEnum
语言类型(zh、en、ja、ko、zhTw 等)。

TranslateLangEnum 枚举值

TranslateLangEnum 用于定义支持的语言类型,其枚举值如下:
枚举值
描述
zh
中文
en
英文
ja
日文
ko
韩文
zhTw
繁体中文
fr
法文
de
德文
es
西班牙文
ru
俄文

TCICFontConfig 字段信息

TCICFontConfig 用于配置字体信息,其字段信息如下:
字段名
类型
是否必填
描述
fontFamily
String
字体族名称。
fontPath
String
字体文件路径(相对于 assets 目录)。
fontUrl
String
字体文件 URL(网络字体)。
enableCustomFont
bool
是否启用自定义字体(默认为 false)。
fontWeights
Map<FontWeight, String>
字体权重配置。
fontStyles
Map<FontStyle, String>
字体样式配置。

TCICNameConfig 字段信息

TCICNameConfig 用于配置不同语言下的名称显示,其字段信息如下:
字段名
类型
是否必填
描述
zh
NameConfigInfo
中文名称配置。
en
NameConfigInfo
英文名称配置。
ja
NameConfigInfo
日文名称配置。
ko
NameConfigInfo
韩文名称配置。
zhTw
NameConfigInfo
繁体中文名称配置。

NameConfigInfo 字段信息

NameConfigInfo 用于定义具体语言下的各项名称,其字段信息如下:
字段名
类型
是否必填
描述
teacher
String
老师
assistant
String
助教
student
String
学生
host
String
主持人
coHost
String
副主持人
panelist
String
panelist
viewer
String
观众
raiseHand
String
举手
lowerHand
String
放下手
chat
String
聊天
whiteboard
String
白板
fileShare
String
文件分享
screenShare
String
屏幕分享

回调函数

TCICCallback 支持以下回调:
onJoinedClassSuccess:加入课堂成功
afterExitedClass:退出课堂后
onJoinedClassFailed:加入课堂失败
onKickedOffClass:被踢出课堂
onMemberJoinedClass:成员加入课堂
onMemberLeaveClass:成员离开课堂
onReceivedMessage:收到消息
beforeExitedClass:退出课堂前(返回 false 可取消退出)
beforeRenderMessage:渲染消息前(返回 false 可不渲染)

常见问题

1. 权限问题

Android 权限被拒绝:
检查 AndroidManifest.xml 中是否已添加相应权限。
运行时权限需要在代码中动态申请。
某些权限(如相机、麦克风)需要用户手动授权。
iOS 权限被拒绝:
检查 Info.plist 中是否已添加权限描述。
确保权限描述文本清晰明了。
某些权限首次使用时会弹出授权对话框。

2. 音视频问题

无法听到声音:
检查设备音量设置。
确认麦克风权限已授权。
检查音频设备连接状态。
无法看到视频:
检查相机权限已授权。
确认设备相机功能正常。
检查网络连接状态。

3. 网络问题

连接失败:
检查网络连接状态。
确认防火墙设置。
验证 SDKAppId 和 token 是否正确。
音视频卡顿:
检查网络带宽是否充足。
确认设备性能是否满足要求。
考虑降低音视频质量设置。

4. 白板问题

白板无法加载:
检查网络连接状态。
确认白板服务是否正常。
验证白板配置参数。
白板操作无响应:
检查触摸事件是否正常。
确认白板组件状态。
验证用户权限设置。

技术支持

如果您在使用过程中遇到问题,可以通过以下方式获取技术支持: