// import 'package:flutter/material.dart'; // import 'package:vbvs_app/common/util/FitTool.dart'; // class CustomCard extends StatefulWidget { // final double borderRadius; // 圆角 // final VoidCallback onTap; // 点击回调 // final List colors; // 背景颜色列表 // final Widget child; // 子组件 // final bool enableAnimation; // 是否启用动画效果 // final bool enableGradient; // 是否启用渐变 // const CustomCard({ // Key? key, // required this.borderRadius, // required this.onTap, // required this.colors, // required this.child, // this.enableAnimation = true, // 默认启用动画效果 // this.enableGradient = true, // 默认启用渐变效果 // }) : super(key: key); // @override // State createState() => _CustomCardState(); // } // class _CustomCardState extends State // with SingleTickerProviderStateMixin { // double _scale = 1.0; // final Duration _animationDuration = const Duration(milliseconds: 50); // Future _handleTap() async { // if (widget.enableAnimation) { // setState(() { // _scale = 0.95; // }); // await Future.delayed(_animationDuration); // setState(() { // _scale = 1.0; // }); // } // widget.onTap(); // } // @override // Widget build(BuildContext context) { // final bool isGradient = widget.enableGradient && widget.colors.length > 1; // final Color baseColor = widget.colors.first; // return Material( // color: Colors.transparent, // borderRadius: BorderRadius.circular(widget.borderRadius), // child: InkWell( // onTap: _handleTap, // borderRadius: BorderRadius.circular(widget.borderRadius), // splashColor: widget.colors.first.withOpacity(0.2), // child: widget.enableAnimation // ? AnimatedScale( // scale: _scale, // duration: _animationDuration, // curve: Curves.easeInOut, // child: _buildContent(isGradient, baseColor), // ) // : _buildContent(isGradient, baseColor), // ), // ); // } // Widget _buildContent(bool isGradient, Color baseColor) { // return Container( // decoration: BoxDecoration( // color: isGradient ? null : baseColor, // gradient: isGradient // ? LinearGradient( // colors: widget.colors, // begin: Alignment.topLeft, // end: Alignment.bottomRight, // ) // : null, // borderRadius: BorderRadius.circular(widget.borderRadius), // ), // child: Padding( // padding: EdgeInsets.fromLTRB(0.rpx, 0.rpx, 0.rpx, 5.rpx), // child: widget.child, // ), // ); // } // } import 'package:flutter/material.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; /// 枚举控制渐变方向 enum GradientDirection { horizontal, vertical, } class CustomCard extends StatefulWidget { final double borderRadius; // 圆角 final VoidCallback onTap; // 点击回调 final List colors; // 背景颜色列表 final Widget child; // 子组件 final bool enableAnimation; // 是否启用动画效果 final bool enableGradient; // 是否启用渐变 final GradientDirection gradientDirection; // 渐变方向 final EdgeInsetsGeometry? margin; // 外部间距 const CustomCard({ Key? key, required this.borderRadius, required this.onTap, required this.colors, required this.child, this.enableAnimation = true, this.enableGradient = true, this.gradientDirection = GradientDirection.horizontal, this.margin, }) : super(key: key); @override State createState() => _CustomCardState(); } class _CustomCardState extends State with SingleTickerProviderStateMixin { double _scale = 1.0; final Duration _animationDuration = const Duration(milliseconds: 50); Future _handleTap() async { if (widget.enableAnimation) { setState(() { _scale = 0.95; }); await Future.delayed(_animationDuration); setState(() { _scale = 1.0; }); } widget.onTap(); } @override Widget build(BuildContext context) { final bool isGradient = widget.enableGradient && widget.colors.length > 1; final Color baseColor = widget.colors.first; return Container( margin: widget.margin, // 应用外部间距 child: Material( color: Colors.transparent, borderRadius: BorderRadius.circular(widget.borderRadius), child: InkWell( onTap: _handleTap, borderRadius: BorderRadius.circular(widget.borderRadius), splashColor: widget.colors.first.withOpacity(0.2), child: widget.enableAnimation ? AnimatedScale( scale: _scale, duration: _animationDuration, curve: Curves.easeInOut, child: _buildContent(isGradient, baseColor), ) : _buildContent(isGradient, baseColor), ), ), ); } Widget _buildContent(bool isGradient, Color baseColor) { return Container( decoration: BoxDecoration( color: isGradient ? null : baseColor, gradient: isGradient ? LinearGradient( colors: widget.colors, begin: widget.gradientDirection == GradientDirection.vertical ? Alignment.topCenter : Alignment.centerLeft, end: widget.gradientDirection == GradientDirection.vertical ? Alignment.bottomCenter : Alignment.centerRight, ) : null, borderRadius: BorderRadius.circular(widget.borderRadius), ), child: Padding( padding: EdgeInsets.fromLTRB(0.rpx, 0.rpx, 0.rpx, 0.rpx), child: widget.child, ), ); } }