115 lines
2.5 KiB
Dart
115 lines
2.5 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:app/utils/time.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:provider/provider.dart';
|
|
|
|
import 'content_view.dart';
|
|
import '../viewmodel/students_view_model.dart';
|
|
|
|
class StatusView extends StatefulWidget {
|
|
const StatusView({super.key});
|
|
|
|
@override
|
|
State<StatusView> createState() => _StatusViewState();
|
|
}
|
|
|
|
class _StatusViewState extends State<StatusView> {
|
|
///房间状态
|
|
RoomStatus status = RoomStatus.loading;
|
|
|
|
///剩余秒
|
|
int _seconds = 0;
|
|
Timer? _timer;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_init();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
super.dispose();
|
|
_timer?.cancel();
|
|
_timer = null;
|
|
}
|
|
|
|
void _init() {
|
|
final vm = context.read<StudentsViewModel>();
|
|
//如果房间可以开始
|
|
if (vm.canEnterRoom) {
|
|
status = RoomStatus.start;
|
|
} else {
|
|
status = RoomStatus.waiting;
|
|
startCountDown();
|
|
}
|
|
}
|
|
|
|
///开始倒计时
|
|
void startCountDown() {
|
|
final vm = context.read<StudentsViewModel>();
|
|
//当前时间
|
|
DateTime now = DateTime.now();
|
|
//远端时间
|
|
setState(() {
|
|
_seconds = vm.startTime.difference(now).inSeconds;
|
|
});
|
|
_timer = Timer.periodic(Duration(seconds: 1), (timer) {
|
|
setState(() {
|
|
_seconds--;
|
|
});
|
|
if (_seconds <= 0) {
|
|
_timer?.cancel();
|
|
_timer = null;
|
|
setState(() {
|
|
status = RoomStatus.start;
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
///开启自习室
|
|
void openRoom() {
|
|
final vm = context.read<StudentsViewModel>();
|
|
vm.toggleRoom(isOpen: true);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
if (status == RoomStatus.waiting) {
|
|
return Align(
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Text(
|
|
"未到开播时间,到点后自动开播",
|
|
style: TextStyle(color: Colors.white),
|
|
),
|
|
Container(
|
|
margin: EdgeInsets.symmetric(vertical: 10),
|
|
child: Text(
|
|
formatSeconds(_seconds),
|
|
style: TextStyle(
|
|
color: Colors.white,
|
|
fontSize: 26,
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
} else if (status == RoomStatus.start) {
|
|
return ContentView();
|
|
}
|
|
return SizedBox();
|
|
}
|
|
}
|
|
|
|
enum RoomStatus {
|
|
loading, // 加载中
|
|
waiting, //房间倒计时等待中
|
|
start, //房间开始中
|
|
}
|