172 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			172 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:auto_size_text/auto_size_text.dart';
 | |
| import 'package:flutter/material.dart';
 | |
| import 'package:get/get.dart';
 | |
| 
 | |
| import '../../common.dart';
 | |
| 
 | |
| class Button extends StatefulWidget {
 | |
|   final GestureTapCallback onTap;
 | |
|   final String text;
 | |
|   final double? textSize;
 | |
|   final double? minWidth;
 | |
|   final bool isOutline;
 | |
|   final double? padding;
 | |
|   final Color? textColor;
 | |
|   final double? radius;
 | |
|   final Color? borderColor;
 | |
| 
 | |
|   Button({
 | |
|     Key? key,
 | |
|     this.minWidth,
 | |
|     this.isOutline = false,
 | |
|     this.textSize,
 | |
|     this.padding,
 | |
|     this.textColor,
 | |
|     this.radius,
 | |
|     this.borderColor,
 | |
|     required this.onTap,
 | |
|     required this.text,
 | |
|   }) : super(key: key);
 | |
| 
 | |
|   @override
 | |
|   State<Button> createState() => _ButtonState();
 | |
| }
 | |
| 
 | |
| class _ButtonState extends State<Button> {
 | |
|   RxBool hover = false.obs;
 | |
|   RxBool pressed = false.obs;
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     return Obx(() => InkWell(
 | |
|           onTapDown: (_) => pressed.value = true,
 | |
|           onTapUp: (_) => pressed.value = false,
 | |
|           onTapCancel: () => pressed.value = false,
 | |
|           onHover: (value) => hover.value = value,
 | |
|           onTap: widget.onTap,
 | |
|           child: ConstrainedBox(
 | |
|               constraints: BoxConstraints(
 | |
|                 minWidth: widget.minWidth ?? 70.0,
 | |
|               ),
 | |
|               child: Container(
 | |
|                 padding: EdgeInsets.all(widget.padding ?? 4.5),
 | |
|                 alignment: Alignment.center,
 | |
|                 decoration: BoxDecoration(
 | |
|                   color: pressed.value
 | |
|                       ? MyTheme.accent
 | |
|                       : (widget.isOutline
 | |
|                           ? Colors.transparent
 | |
|                           : MyTheme.button),
 | |
|                   border: Border.all(
 | |
|                     color: pressed.value
 | |
|                         ? MyTheme.accent
 | |
|                         : hover.value
 | |
|                             ? MyTheme.hoverBorder
 | |
|                             : (widget.isOutline
 | |
|                                 ? widget.borderColor ?? MyTheme.border
 | |
|                                 : MyTheme.button),
 | |
|                   ),
 | |
|                   borderRadius: BorderRadius.circular(widget.radius ?? 5),
 | |
|                 ),
 | |
|                 child: Text(
 | |
|                   translate(
 | |
|                     widget.text,
 | |
|                   ),
 | |
|                   style: TextStyle(
 | |
|                       fontSize: widget.textSize ?? 12.0,
 | |
|                       color: widget.isOutline
 | |
|                           ? widget.textColor ??
 | |
|                               Theme.of(context).textTheme.titleLarge?.color
 | |
|                           : Colors.white),
 | |
|                 ).marginSymmetric(horizontal: 12),
 | |
|               )),
 | |
|         ));
 | |
|   }
 | |
| }
 | |
| 
 | |
| class FixedWidthButton extends StatefulWidget {
 | |
|   final GestureTapCallback onTap;
 | |
|   final String text;
 | |
|   final double? textSize;
 | |
|   final double width;
 | |
|   final bool isOutline;
 | |
|   final double? padding;
 | |
|   final Color? textColor;
 | |
|   final double? radius;
 | |
|   final Color? borderColor;
 | |
|   final int? maxLines;
 | |
| 
 | |
|   FixedWidthButton({
 | |
|     Key? key,
 | |
|     required this.width,
 | |
|     this.maxLines,
 | |
|     this.isOutline = false,
 | |
|     this.textSize,
 | |
|     this.padding,
 | |
|     this.textColor,
 | |
|     this.radius,
 | |
|     this.borderColor,
 | |
|     required this.onTap,
 | |
|     required this.text,
 | |
|   }) : super(key: key);
 | |
| 
 | |
|   @override
 | |
|   State<FixedWidthButton> createState() => _FixedWidthButtonState();
 | |
| }
 | |
| 
 | |
| class _FixedWidthButtonState extends State<FixedWidthButton> {
 | |
|   RxBool hover = false.obs;
 | |
|   RxBool pressed = false.obs;
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     return Obx(() => InkWell(
 | |
|           onTapDown: (_) => pressed.value = true,
 | |
|           onTapUp: (_) => pressed.value = false,
 | |
|           onTapCancel: () => pressed.value = false,
 | |
|           onHover: (value) => hover.value = value,
 | |
|           onTap: widget.onTap,
 | |
|           child: Container(
 | |
|             width: widget.width,
 | |
|             padding: EdgeInsets.all(widget.padding ?? 4.5),
 | |
|             alignment: Alignment.center,
 | |
|             decoration: BoxDecoration(
 | |
|               color: pressed.value
 | |
|                   ? MyTheme.accent
 | |
|                   : (widget.isOutline ? Colors.transparent : MyTheme.button),
 | |
|               border: Border.all(
 | |
|                 color: pressed.value
 | |
|                     ? MyTheme.accent
 | |
|                     : hover.value
 | |
|                         ? MyTheme.hoverBorder
 | |
|                         : (widget.isOutline
 | |
|                             ? widget.borderColor ?? MyTheme.border
 | |
|                             : MyTheme.button),
 | |
|               ),
 | |
|               borderRadius: BorderRadius.circular(widget.radius ?? 5),
 | |
|             ),
 | |
|             child: Row(
 | |
|               mainAxisAlignment: MainAxisAlignment.center,
 | |
|               children: [
 | |
|                 Flexible(
 | |
|                   child: AutoSizeText(
 | |
|                     translate(
 | |
|                       widget.text,
 | |
|                     ),
 | |
|                     maxLines: widget.maxLines ?? 1,
 | |
|                     textAlign: TextAlign.center,
 | |
|                     style: TextStyle(
 | |
|                         fontSize: widget.textSize ?? 12.0,
 | |
|                         color: widget.isOutline
 | |
|                             ? widget.textColor ??
 | |
|                                 Theme.of(context).textTheme.titleLarge?.color
 | |
|                             : Colors.white),
 | |
|                   ).marginSymmetric(horizontal: 12),
 | |
|                 ),
 | |
|               ],
 | |
|             ),
 | |
|           ),
 | |
|         ));
 | |
|   }
 | |
| }
 |