自定义插件
本文介绍灵动课堂插件机制的原理、灵动课堂内置插件、以及如何新增一个插件。
本文仅针对 2.7.0 或之后版本。如需了解如何在 2.4.x、2.5.x、2.6.x 版本上自定义插件,请参考自定义插件(旧版)。
技术原理
灵动课堂提供插件机制,帮助开发者集成源代码时为业务需求扩展课堂能力。同时,通过插件机制,可以降低自定义业务与课堂的代码耦合程度,从而降低集成源代码的后期升级难度。
插件的技术原理分为:
- 插件的生命周期
- 插件的实例化
- 插件的挂载点
- 插件的通信机制
- 插件用于扩展教室能力
- 插件用于调用教室能力
- 插件的轨迹同步和多语言能力
详见插件的技术原理介绍。
内置插件
本节介绍灵动课堂内置的插件。它们扩展了教室能力,主要分为以下两类:
- 通用类插件
- 互动白板
- IM 模块
- 内嵌浏览器
- 视频同步播放器(目前仅支持 Youtube 视频)
- 水印插件
- 教具类插件
- 答题器
- 投票器
- 计时器
内置插件的源代码均位于 apaas-widgets-web 仓库的 src/gallery
目录下,具体为如下:
插件名称 | 源代码文件夹 | UMD 模块名 |
---|---|---|
互动白板(适配 AgoraEduSDK) | classroom/whiteboard | FcrBoardWidget |
IM 模块(适配 AgoraEduSDK) | classroom/im | AgoraHXChatWidget |
内嵌浏览器(适配 AgoraEduSDK) | classroom/webview | FcrWebviewWidget |
视频同步播放器(适配 AgoraEduSDK) | classroom/stream-media | FcrStreamMediaPlayerWidget |
答题器(适配 AgoraEduSDK) | classroom/answer | AgoraSelector |
投票器(适配 AgoraEduSDK) | classroom/vote | AgoraPolling |
计时器(适配 AgoraEduSDK) | classroom/counter | AgoraCountdown |
水印插件(适配 AgoraEduSDK) | classroom/watermark | FcrWatermarkWidget |
内嵌浏览器(适配 AgoraProctorSDK) | proctor/webview | FcrWebviewWidget |
聊天室(适配 FcrUIScene) | scene/chatroom | FcrChatroom |
计时器(适配 FcrUIScene) | scene/countdown | FcrCountdownWidget |
投票器(适配 FcrUIScene) | scene/polling | FcrPollingWidget |
答题器(适配 FcrUIScene) | scene/quiz | FcrPopupQuizWidget |
视频同步播放器(适配 FcrUIScene) | scene/stream-media | FcrStreamMediaPlayerWidget |
内嵌浏览器(适配 FcrUIScene) | scene/webview | FcrWebviewWidget |
互动白板(适配 FcrUIScene) | scene/whiteboard | FcrBoardWidget |
新增一个插件
如果你需要新增一个自定义的 Widget,可继承灵动课堂提供的 AgoraWidgetBase
类,并实现抽象方法。
如下是 AgoraWidgetBase
类的定义:
下面展示新增一个 ExampleWidget
来实现一个最基本的 Widget。
使用 AgoraWidgetBase
创建一个继承 AgoraWidgetBase
类的 ExampleWidget
类:
launch 中传入自定义的 Widget
通过 launch
中的 widgets
参数传入自定义 Widget:
const widgets = {
// 需要引入上面定义的 ExampleWidget 类
'example': ExampleWidget
};
// 填入你使用的 SDK 名,如 AgoraEduSDK、AgoraProctorSDK
AgoraEduSDK.launch(dom, {
// ...
widgets: widgets
// ...
});
创建自定义的 Widget
因为这里的 ExampleWidget
为自定义的 Widget,因此需要手动调用 WidgetUIStore
中的 createWidget
方法来创建 Widget:
// 修改 WidgetUIStore 代码
// 文件路径 packages/agora-classroom-sdk/src/infra/stores/common/widget/index.ts 文件中加入代码
onInstall() {
// ...
// 在 onInstall 方法最后加入此代码,在房间加入成功后打开指定 Widget
this._disposers.push(
reaction(
() => this.classroomStore.widgetStore.widgetController,
() => {
// 打开我们新增的 widget ,此处传入 widgetName
this.createWidget('example');
},
),
);
}
插件效果展示
启动教室,插件挂载后的效果如图:
基于现有能力快速创建一个教具插件
灵动课堂为开发者提供了一个名为 AgoraEduToolWidget
抽象类,此类实现了教具类插件通用能力的封装。继承此类可以获得插件的轨迹同步、层级控制能力,以及对 UI 窗口的显示和显示的控制逻辑。
配合 ControlledModal
组件,你还可快速实现内置教具插件的外层窗口,减少大量的通用逻辑代码开发,具体实现请参考仓库 src/gallery
目录下 answer
、vote
、counter
文件夹,其中提供灵动课堂内置的教具类插件源代码。
如下是 AgoraEduToolWidget
类的定义:
下面展示如何基于灵动课堂现有 Widget 能力创建一个课前点名的教具插件。完整源代码见 rollbook-widget。
使用 AgoraEduToolWidget
创建一个继承 AgoraEduToolWidget
类的 RollbookWidget
类:
增加渲染组件
增加一个 App 组件用于在插件窗口中渲染:
launch 中传入自定义的 Widget
通过 launch
中的 widgets
参数传入自定义 Widget:
const widgets = {
// 需要引入上面定义的 RollbookWidget 类
'rollbook': RollbookWidget
};
// 填入你使用的 SDK 名,如 AgoraEduSDK、AgoraProctorSDK
AgoraEduSDK.launch(dom, {
...
widgets: widgets
...
});
插件效果展示
启动教室,可以在工具箱中找到此插件,如图:
老师点击并打开插件的界面效果:
老师点击 Start Check-In 后,学生端显示插件的效果:
学生点击 Check-In 后,老师端签到列表中显示此学生的效果: