This commit is contained in:
zhutao
2025-11-20 18:00:34 +08:00
parent 701b99b138
commit b7239292d1
45 changed files with 1499 additions and 354 deletions

View File

@@ -1,33 +1,78 @@
import 'package:app/data/models/student.dart';
import 'package:app/websocket/room_websocket.dart';
import 'package:app/request/dto/room/room_user_dto.dart';
import 'package:app/request/websocket/room_protocol.dart';
import 'package:app/request/websocket/room_websocket.dart';
import 'package:app/utils/time.dart';
import 'package:flutter/cupertino.dart';
class StudentsViewModel extends ChangeNotifier {
///学生摄像头列表
List<Student> _students = [];
///房间的基础信息房间id、房间开始时间
final int roomId;
late final DateTime startTime;
StudentsViewModel({required this.roomId, String? start}) {
startTime = parseTime(start!);
_startRoom();
}
List<Student> get students => _students;
///是否能开始自习室
bool get canEnterRoom {
final now = DateTime.now();
// 如果到了开始时间,则可以进入房间
if (now.isAfter(startTime)) {
return true;
}
return false;
}
///websocket管理
late RoomWebSocket _ws;
StudentsViewModel() {
_startRoom();
}
///开始链接房间
void _startRoom() {
void _startRoom() async {
_ws = RoomWebSocket();
_ws.connect();
//如果socket的token没有先初始化
if (_ws.wsToken.isEmpty) {
await _ws.initToken(roomId);
}
//启动连接
await _ws.connect();
//进入房间命令
_ws.send(RoomCommand.joinRoom);
//监听各种ws事件
_ws.stream.listen((msg) {
_handleMessage();
if (msg.event == RoomEvent.changeUser) {
final list = msg.data['user_list'].map((x) => RoomUserDto.fromJson(x)).toList();
onStudentChange(list);
}
});
notifyListeners();
}
///发送命令
void _handleMessage() {
print("监听webscoket传来的事件");
///自习室的开关
/// - [isOpen]: 是否开启
void toggleRoom({required bool isOpen}) {
if (isOpen) {
_ws.send(RoomCommand.openRoom);
} else {
_ws.send(RoomCommand.closeRoom);
}
}
///学生人员变化事件,(如加入、退出、掉线)
void onStudentChange(List<RoomUserDto> list) {}
//销毁
@override
void dispose() {
super.dispose();
_ws.dispose();
}
}