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 createState() => _StatusViewState(); } class _StatusViewState extends State { 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(); /// 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(); } }