优化了老师端的等待状态判断逻辑
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:app/utils/time.dart';
|
||||
import 'package:app/widgets/base/dialog/config_dialog.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import 'content_view.dart';
|
||||
@@ -15,86 +17,97 @@ class StatusView extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _StatusViewState extends State<StatusView> {
|
||||
///房间状态
|
||||
RoomStatus status = RoomStatus.loading;
|
||||
|
||||
///剩余秒
|
||||
int _seconds = 0;
|
||||
Timer? _timer;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_init();
|
||||
final vm = context.read<TchRoomVM>();
|
||||
vm.addListener(openRoom);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
_timer?.cancel();
|
||||
_timer = null;
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void _init() {
|
||||
final vm = context.read<TchRoomVM>();
|
||||
//如果房间到点可以开始
|
||||
if (vm.canEnterRoom) {
|
||||
status = RoomStatus.start;
|
||||
// openRoom();
|
||||
} else {
|
||||
status = RoomStatus.waiting;
|
||||
startCountDown();
|
||||
void _startCountDown(DateTime startTime) {
|
||||
// 避免重复计时器
|
||||
if (_timer != null) return;
|
||||
|
||||
final now = DateTime.now();
|
||||
int diff = startTime.difference(now).inSeconds;
|
||||
|
||||
if (diff <= 0) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
///开始倒计时
|
||||
void startCountDown() {
|
||||
final vm = context.read<TchRoomVM>();
|
||||
//当前时间
|
||||
DateTime now = DateTime.now();
|
||||
//远端时间
|
||||
setState(() {
|
||||
_seconds = parseTime(vm.roomInfo.startTime).difference(now).inSeconds;
|
||||
_seconds = diff;
|
||||
});
|
||||
_timer = Timer.periodic(Duration(seconds: 1), (timer) {
|
||||
|
||||
_timer = Timer.periodic(const Duration(seconds: 1), (timer) {
|
||||
if (!mounted) return;
|
||||
setState(() {
|
||||
_seconds--;
|
||||
});
|
||||
|
||||
if (_seconds <= 0) {
|
||||
_timer?.cancel();
|
||||
_timer = null;
|
||||
setState(() {
|
||||
status = RoomStatus.start;
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
///开启自习室
|
||||
void openRoom() {
|
||||
final vm = context.read<TchRoomVM>();
|
||||
vm.toggleRoom(isOpen: true);
|
||||
vm.removeListener(openRoom);
|
||||
///开播中返回拦截弹窗
|
||||
void _interceptPop() {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return ConfigDialog(
|
||||
content: "是否退出自习室",
|
||||
onCancel: () {
|
||||
context.pop();
|
||||
},
|
||||
onConfirm: () {
|
||||
context.pop();
|
||||
context.pop();
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (status == RoomStatus.waiting) {
|
||||
final vm = context.watch<TchRoomVM>();
|
||||
|
||||
/// 1. 未加载
|
||||
if (vm.roomStatus == -1) {
|
||||
return const Align(
|
||||
child: Text("加载中", style: TextStyle(color: Colors.white)),
|
||||
);
|
||||
}
|
||||
|
||||
/// 2. 未开始的房间
|
||||
if (vm.roomStatus == 0) {
|
||||
if (vm.canEnterRoom) {
|
||||
// 到时间了 → 自动开播
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
vm.toggleRoom(isOpen: true);
|
||||
});
|
||||
} else {
|
||||
// 没到时间 → 启动倒计时
|
||||
_startCountDown(parseTime(vm.roomInfo.startTime));
|
||||
}
|
||||
|
||||
return Align(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text(
|
||||
const Text(
|
||||
"未到开播时间,到点后自动开播",
|
||||
style: TextStyle(color: Colors.white),
|
||||
),
|
||||
Container(
|
||||
margin: EdgeInsets.symmetric(vertical: 10),
|
||||
margin: const EdgeInsets.symmetric(vertical: 10),
|
||||
child: Text(
|
||||
formatSeconds(_seconds),
|
||||
style: TextStyle(
|
||||
style: const TextStyle(
|
||||
color: Colors.white,
|
||||
fontSize: 26,
|
||||
fontWeight: FontWeight.bold,
|
||||
@@ -104,15 +117,21 @@ class _StatusViewState extends State<StatusView> {
|
||||
],
|
||||
),
|
||||
);
|
||||
} else if (status == RoomStatus.start) {
|
||||
return ContentView();
|
||||
}
|
||||
return SizedBox();
|
||||
|
||||
/// 3. 已开播
|
||||
if (vm.roomStatus == 1) {
|
||||
return PopScope(
|
||||
canPop: false,
|
||||
onPopInvokedWithResult: (didPop, _) {
|
||||
if (!didPop) {
|
||||
_interceptPop();
|
||||
}
|
||||
},
|
||||
child: const ContentView(),
|
||||
);
|
||||
}
|
||||
|
||||
return const SizedBox();
|
||||
}
|
||||
}
|
||||
|
||||
enum RoomStatus {
|
||||
loading, // 加载中
|
||||
waiting, //房间倒计时等待中
|
||||
start, //房间开始中
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user