54 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
import 'package:flutter/material.dart';
 | 
						|
import 'package:get/get.dart';
 | 
						|
 | 
						|
class AnimatedRotationWidget extends StatefulWidget {
 | 
						|
  final VoidCallback onPressed;
 | 
						|
  final ValueChanged<bool>? onHover;
 | 
						|
  final Widget child;
 | 
						|
  final RxBool? spinning;
 | 
						|
  const AnimatedRotationWidget(
 | 
						|
      {super.key,
 | 
						|
      required this.onPressed,
 | 
						|
      required this.child,
 | 
						|
      this.spinning,
 | 
						|
      this.onHover});
 | 
						|
 | 
						|
  @override
 | 
						|
  State<AnimatedRotationWidget> createState() => AnimatedRotationWidgetState();
 | 
						|
}
 | 
						|
 | 
						|
class AnimatedRotationWidgetState extends State<AnimatedRotationWidget> {
 | 
						|
  double turns = 0.0;
 | 
						|
 | 
						|
  @override
 | 
						|
  void initState() {
 | 
						|
    super.initState();
 | 
						|
    widget.spinning?.listen((v) {
 | 
						|
      if (v && mounted) {
 | 
						|
        setState(() {
 | 
						|
          turns += 1;
 | 
						|
        });
 | 
						|
      }
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context) {
 | 
						|
    return AnimatedRotation(
 | 
						|
        turns: turns,
 | 
						|
        duration: const Duration(milliseconds: 200),
 | 
						|
        onEnd: () {
 | 
						|
          if (widget.spinning?.value == true && mounted) {
 | 
						|
            setState(() => turns += 1.0);
 | 
						|
          }
 | 
						|
        },
 | 
						|
        child: InkWell(
 | 
						|
            onTap: () {
 | 
						|
              if (mounted) setState(() => turns += 1.0);
 | 
						|
              widget.onPressed();
 | 
						|
            },
 | 
						|
            onHover: widget.onHover,
 | 
						|
            child: widget.child));
 | 
						|
  }
 | 
						|
}
 |