count_down_dialog.dart 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import 'dart:async';
  2. import 'package:audioplayers/audioplayers.dart';
  3. import 'package:flutter/material.dart';
  4. Future<void> showCountDown(BuildContext context) {
  5. return Navigator.push(context, RawDialogRoute(
  6. pageBuilder: (_, __, ___) {
  7. return const _CountDownContent();
  8. },
  9. ));
  10. }
  11. class _CountDownContent extends StatefulWidget {
  12. const _CountDownContent({super.key});
  13. @override
  14. State<_CountDownContent> createState() => _CountDownContentState();
  15. }
  16. class _CountDownContentState extends State<_CountDownContent> {
  17. int _count = 4;
  18. Timer? _timer;
  19. late AudioPlayer _audioPlayer;
  20. @override
  21. void initState() {
  22. super.initState();
  23. _audioPlayer = AudioPlayer();
  24. _timer = Timer.periodic(const Duration(seconds: 1), (t) {
  25. if (t.tick < 4) {
  26. if (mounted) {
  27. setState(() {
  28. _count = 4 - t.tick;
  29. });
  30. }
  31. _audioPlayer.play(AssetSource('audios/counting${t.tick}.mp3'), mode: PlayerMode.lowLatency);
  32. } else {
  33. _audioPlayer.play(AssetSource('audios/counted.mp3'), mode: PlayerMode.lowLatency);
  34. _timer?.cancel();
  35. _timer = null;
  36. if (mounted) {
  37. Future.delayed(const Duration(milliseconds: 200), () => Navigator.pop(context));
  38. }
  39. }
  40. });
  41. }
  42. @override
  43. void dispose() {
  44. _timer?.cancel();
  45. super.dispose();
  46. }
  47. @override
  48. Widget build(BuildContext context) {
  49. return Material(
  50. type: MaterialType.transparency,
  51. child: Center(
  52. child: Container(
  53. constraints: const BoxConstraints(maxWidth: 300),
  54. child: Column(
  55. mainAxisSize: MainAxisSize.min,
  56. children: [
  57. Container(
  58. width: double.infinity,
  59. height: 300,
  60. alignment: Alignment.center,
  61. decoration: BoxDecoration(
  62. color: Theme.of(context).colorScheme.primaryContainer,
  63. borderRadius: BorderRadius.circular(8),
  64. ),
  65. child: Text(
  66. _count >= 4 ? 'Ready' : '$_count',
  67. style: TextStyle(
  68. fontSize: 33,
  69. color: Theme.of(context).colorScheme.onPrimaryContainer,
  70. ),
  71. ),
  72. ),
  73. ],
  74. ),
  75. ),
  76. ),
  77. );
  78. }
  79. }