40 lines
1.0 KiB
Dart
40 lines
1.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_animate/flutter_animate.dart';
|
|
|
|
class ScaleButton extends StatefulWidget {
|
|
final Widget child;
|
|
final VoidCallback? onPressed;
|
|
final Duration duration;
|
|
final double scale;
|
|
|
|
const ScaleButton({
|
|
super.key,
|
|
required this.child,
|
|
required this.onPressed,
|
|
this.duration = const Duration(milliseconds: 100),
|
|
this.scale = 0.95,
|
|
});
|
|
|
|
@override
|
|
State<ScaleButton> createState() => _ScaleButtonState();
|
|
}
|
|
|
|
class _ScaleButtonState extends State<ScaleButton> {
|
|
bool _isPressed = false;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return GestureDetector(
|
|
onTapDown: (_) => setState(() => _isPressed = true),
|
|
onTapUp: (_) {
|
|
setState(() => _isPressed = false);
|
|
widget.onPressed?.call();
|
|
},
|
|
onTapCancel: () => setState(() => _isPressed = false),
|
|
child: widget.child
|
|
.animate(target: _isPressed ? 1 : 0)
|
|
.scaleXY(end: widget.scale, duration: widget.duration),
|
|
);
|
|
}
|
|
}
|