Files
xueguang_flutter_app/lib/widgets/room/board/board_manager.dart
2025-11-28 18:01:09 +08:00

102 lines
2.8 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'package:app/global/config.dart';
import 'package:app/request/api/room_api.dart';
import 'package:app/request/dto/room/board_token_dto.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'board_dialog.dart';
class BoardManager {
BoardManager._();
static final BoardManager _instance = BoardManager._();
factory BoardManager() => _instance;
WebViewController? _webViewController;
BoardTokenDto? _boardToken;
///获取token
Future<void> _fetchToken(int roomId) async {
final now = DateTime.now();
if (_boardToken == null) {
EasyLoading.show(status: "开启白板中");
_boardToken = await getBoardTokenApi(roomId);
} else {
//离过期差多少小时
int remainSeconds = _boardToken!.expiresAt.difference(now).inSeconds;
// 剩余不足 2 小时 = 7200 秒
if (remainSeconds <= 7200) {
EasyLoading.show(status: "开启白板中");
_boardToken = await getBoardTokenApi(roomId);
}
}
EasyLoading.dismiss();
}
///生成完整 URL
/// -[uid] 用户
/// -[roomId] 房间id
/// -[isTeacher] 是否是老师
Future<String> buildUrl({
required String uid,
required int roomId,
required bool isTeacher,
}) async {
await _fetchToken(roomId);
Map<String, dynamic> params = {
"appid": _boardToken!.whiteboardAppid,
"uid": uid,
"uuid": _boardToken!.whiteboardUuid,
"room_token": _boardToken!.whiteboardToken,
"write": isTeacher ? 1 : 0,
};
String paramStr = params.entries.map((e) => "${e.key}=${e.value}").join("&");
return "${Config.webUrl}/board?$paramStr";
}
/// 获取全局唯一 WebViewController
Future<WebViewController> getController(String url) async {
if (_webViewController != null) return _webViewController!;
_webViewController = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..setNavigationDelegate(
// ⭐ 加上加载监听BoardDialog 再 listen 一次也没关系)
NavigationDelegate(
onPageStarted: (_) {},
onPageFinished: (_) {},
),
)
..loadRequest(Uri.parse(url));
return _webViewController!;
}
///打开白板
/// -[uid] 用户名+id
/// -[roomId] 房间id
/// -[isTeacher] 是否是老师
Future<void> showBoardDialog(
BuildContext context, {
required String uid,
required int roomId,
required bool isTeacher,
}) async {
String url = await buildUrl(
uid: uid,
roomId: roomId,
isTeacher: isTeacher,
);
final controller = await getController(url);
showDialog(
context: context,
builder: (_) => BoardDialog(controller: controller),
);
}
}