amoriai/lib/widgets/common/scale_button.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),
);
}
}