connection_widget.dart 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import 'package:flutter/cupertino.dart';
  2. import 'package:flutter/material.dart';
  3. import 'connection_status.dart';
  4. class ConnectionWidget extends StatefulWidget {
  5. final ConnectionStatus status;
  6. final Function(ConnectionStatus) onStatusChange;
  7. const ConnectionWidget({super.key, required this.status, required this.onStatusChange});
  8. @override
  9. _ConnectionWidgetState createState() => _ConnectionWidgetState();
  10. }
  11. class _ConnectionWidgetState extends State<ConnectionWidget> {
  12. ConnectionStatus _currentStatus = ConnectionStatus.disconnected;
  13. late String currentImage;
  14. @override
  15. void initState() {
  16. super.initState();
  17. _updateImage();
  18. }
  19. void _updateStatus() {
  20. setState(() {
  21. switch (_currentStatus) {
  22. case ConnectionStatus.disconnected:
  23. _currentStatus = ConnectionStatus.connecting;
  24. Future.delayed(const Duration(seconds: 5), () {
  25. if (mounted) { // 确保Widget仍然在Widget树中
  26. setState(() {
  27. _currentStatus = ConnectionStatus.stopped;
  28. _updateImage();
  29. });
  30. }
  31. });
  32. break;
  33. case ConnectionStatus.connecting:
  34. // 在"connecting"状态时加入延迟
  35. //_currentStatus = ConnectionStatus.stopped;
  36. break;
  37. case ConnectionStatus.stopped:
  38. _currentStatus = ConnectionStatus.disconnected;
  39. break;
  40. }
  41. _updateImage();
  42. });
  43. }
  44. @override
  45. void didUpdateWidget(ConnectionWidget oldWidget) {
  46. super.didUpdateWidget(oldWidget);
  47. _updateImage();
  48. }
  49. void _updateImage() {
  50. switch (_currentStatus) {
  51. case ConnectionStatus.disconnected:
  52. currentImage = 'images/main/disconnected.gif';
  53. break;
  54. case ConnectionStatus.connecting:
  55. currentImage = 'images/main/connecting.gif';
  56. break;
  57. case ConnectionStatus.stopped:
  58. currentImage = 'images/main/stopped.gif';
  59. break;
  60. }
  61. }
  62. @override
  63. Widget build(BuildContext context) {
  64. return Stack(
  65. alignment: Alignment.center,
  66. children: <Widget>[
  67. // Gif作为背景
  68. Image.asset(currentImage, fit: BoxFit.cover,width: 250 ,height: 250,),
  69. // 圆形透明按钮
  70. ClipOval(
  71. child: Material(
  72. color: Colors.transparent,
  73. child: GestureDetector(
  74. onTap: _updateStatus,
  75. child: Container(
  76. width: 100, // 按钮宽度
  77. height: 100, // 按钮高度
  78. decoration: const BoxDecoration(
  79. shape: BoxShape.circle,
  80. color: Colors.transparent,
  81. ),
  82. ),
  83. ),
  84. ),
  85. ),
  86. ],
  87. );
  88. }
  89. }