优化了老师端的等待状态判断逻辑

This commit is contained in:
zhutao
2025-11-23 22:09:39 +08:00
parent 5784a0a5d4
commit 4ecb0c35d6
8 changed files with 276 additions and 67 deletions

View File

@@ -1,4 +1,8 @@
import 'package:agora_rtc_engine/agora_rtc_engine.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../viewmodel/stu_room_vm.dart';
class TeacherVideo extends StatefulWidget {
const TeacherVideo({super.key});
@@ -10,10 +14,44 @@ class TeacherVideo extends StatefulWidget {
class _TeacherVideoState extends State<TeacherVideo> {
@override
Widget build(BuildContext context) {
final vm = context.read<StuRoomVM>();
final teacherInfo = vm.teacherInfo;
///没开始
if (vm.roomStatus == 0) {
return _empty("自习室还没开始");
}
///开始
if (vm.roomStatus == 1 && vm.engine != null) {
if (teacherInfo == null) {
return _empty("老师不在自习室内");
}
if (teacherInfo.online == 0) {
return _empty("老师掉线了,请耐心等待");
}
return AgoraVideoView(
controller: VideoViewController(
rtcEngine: vm.engine!,
canvas: VideoCanvas(
uid: vm.teacherInfo!.userId,
),
),
);
}
///结束
if (vm.roomStatus == 2) {
return _empty("自习室已结束");
}
return _empty("加载中");
}
Widget _empty(String title) {
return SafeArea(
child: Align(
child: Text(
"画面准备中",
title,
style: TextStyle(color: Colors.white),
),
),

View File

@@ -1,5 +1,7 @@
import 'dart:async';
import 'package:agora_rtc_engine/agora_rtc_engine.dart';
import 'package:app/config/config.dart';
import 'package:app/providers/user_store.dart';
import 'package:app/request/dto/room/room_info_dto.dart';
import 'package:app/request/dto/room/room_type_dto.dart';
@@ -36,12 +38,48 @@ class StuRoomVM extends ChangeNotifier {
final RoomWebSocket _ws = RoomWebSocket();
StreamSubscription<RoomMessage>? _sub;
RtcTokenDto? get rtcToken => _ws.rtcToken;
/// 声网sdk管理
RtcEngine? _engine;
RtcEngine? get engine => _engine;
StuRoomVM({required this.roomInfo, required this.uid}) {
_startRoom();
}
///初始化声网
Future<void> _initRtc() async {
_engine = createAgoraRtcEngine();
//初始化 RtcEngine设置频道场景为 channelProfileLiveBroadcasting直播场景
await _engine!.initialize(
RtcEngineContext(
appId: Config.swAppId,
channelProfile: ChannelProfileType.channelProfileCommunication,
),
);
//启动视频模块
await _engine!.enableVideo();
//加入频道
await _engine!.joinChannel(
token: _ws.rtcToken!.token,
channelId: _ws.rtcToken!.channel,
uid: uid,
// uid: _ws.rtcToken!.uid,
options: ChannelMediaOptions(
// 自动订阅所有视频流
autoSubscribeVideo: true,
// 自动订阅所有音频流
autoSubscribeAudio: true,
// 发布摄像头采集的视频
publishCameraTrack: true,
// 发布麦克风采集的音频
publishMicrophoneTrack: true,
// 设置用户角色为 clientRoleBroadcaster主播或 clientRoleAudience观众
clientRoleType: ClientRoleType.clientRoleBroadcaster,
),
);
}
///开始链接房间
Future<void> _startRoom() async {
//如果socket的token没有先初始化