import 'package:flutter/material.dart'; import 'dart:async'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:yumi/ui_kit/components/text/sc_text.dart'; class RoomRewardCountdownTimer extends StatefulWidget { final DateTime targetDate; const RoomRewardCountdownTimer({super.key, required this.targetDate}); @override State createState() => _RoomRewardCountdownTimerState(); } class _RoomRewardCountdownTimerState extends State { Timer? _timer; // 剩余时间 Duration _remainingTime = Duration.zero; @override void initState() { super.initState(); _startTimer(); } void _startTimer() { _timer = Timer.periodic(Duration(seconds: 1), (timer) { setState(() { _remainingTime = widget.targetDate.difference(DateTime.now()); // 如果倒计时结束 if (_remainingTime.isNegative) { _remainingTime = Duration.zero; _timer?.cancel(); } }); }); } @override void dispose() { _timer?.cancel(); super.dispose(); } // 格式化数字为两位数 String _formatNumber(int number) { return number.toString().padLeft(2, '0'); } @override Widget build(BuildContext context) { // 计算天、时、分、秒 int days = _remainingTime.inDays; int hours = _remainingTime.inHours.remainder(24); int minutes = _remainingTime.inMinutes.remainder(60); int seconds = _remainingTime.inSeconds.remainder(60); return Center( child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ SizedBox(width: 10.w), _TimeBox( value: days < 10 ? "$days" : _formatNumber(days), label: 'D', ), SizedBox(width: 5.w,), _TimeBox(value: _formatNumber(hours), label: ''), _buildMaohao(), _TimeBox(value: _formatNumber(minutes), label: ''), _buildMaohao(), _TimeBox(value: _formatNumber(seconds), label: ''), SizedBox(width: 10.w), ], ), ); } _buildMaohao(){ return text( ":", fontSize: 24.sp, fontWeight: FontWeight.bold, textColor: Colors.white, ); } } class _TimeBox extends StatelessWidget { final String value; final String label; const _TimeBox({required this.value, required this.label}); @override Widget build(BuildContext context) { return Container( width: 70.w, height: 70.w, decoration: BoxDecoration( image: DecorationImage( image: AssetImage( "sc_images/room/sc_icon_room_reward_countdown_item_bg.png", ), fit: BoxFit.fill, ), ), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ text( value, fontSize: 20.sp, fontWeight: FontWeight.bold, textColor: Colors.white, ), text( label, fontSize: 20.sp, fontWeight: FontWeight.bold, textColor: Colors.white, ), ], ), ); } }