138 lines
3.1 KiB
Dart
138 lines
3.1 KiB
Dart
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';
|
|
import '../viewmodel/tch_room_vm.dart';
|
|
|
|
class StatusView extends StatefulWidget {
|
|
const StatusView({super.key});
|
|
|
|
@override
|
|
State<StatusView> createState() => _StatusViewState();
|
|
}
|
|
|
|
class _StatusViewState extends State<StatusView> {
|
|
int _seconds = 0;
|
|
Timer? _timer;
|
|
|
|
@override
|
|
void dispose() {
|
|
_timer?.cancel();
|
|
super.dispose();
|
|
}
|
|
|
|
void _startCountDown(DateTime startTime) {
|
|
// 避免重复计时器
|
|
if (_timer != null) return;
|
|
|
|
final now = DateTime.now();
|
|
int diff = startTime.difference(now).inSeconds;
|
|
|
|
if (diff <= 0) {
|
|
return;
|
|
}
|
|
setState(() {
|
|
_seconds = diff;
|
|
});
|
|
|
|
_timer = Timer.periodic(const Duration(seconds: 1), (timer) {
|
|
if (!mounted) return;
|
|
setState(() {
|
|
_seconds--;
|
|
});
|
|
|
|
if (_seconds <= 0) {
|
|
_timer?.cancel();
|
|
_timer = null;
|
|
}
|
|
});
|
|
}
|
|
|
|
///开播中返回拦截弹窗
|
|
void _interceptPop() {
|
|
showDialog(
|
|
context: context,
|
|
builder: (context) {
|
|
return ConfigDialog(
|
|
content: "是否退出自习室",
|
|
onCancel: () {
|
|
context.pop();
|
|
},
|
|
onConfirm: () {
|
|
context.pop();
|
|
context.pop();
|
|
},
|
|
);
|
|
},
|
|
);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
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: [
|
|
const Text(
|
|
"未到开播时间,到点后自动开播",
|
|
style: TextStyle(color: Colors.white),
|
|
),
|
|
Container(
|
|
margin: const EdgeInsets.symmetric(vertical: 10),
|
|
child: Text(
|
|
formatSeconds(_seconds),
|
|
style: const TextStyle(
|
|
color: Colors.white,
|
|
fontSize: 26,
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
/// 3. 已开播
|
|
if (vm.roomStatus == 1) {
|
|
return PopScope(
|
|
canPop: false,
|
|
onPopInvokedWithResult: (didPop, _) {
|
|
if (!didPop) {
|
|
_interceptPop();
|
|
}
|
|
},
|
|
child: const ContentView(),
|
|
);
|
|
}
|
|
|
|
return const SizedBox();
|
|
}
|
|
}
|