| 
									
										
										
										
											2022-10-24 15:58:24 +08:00
										 |  |  | import 'package:auto_size_text/auto_size_text.dart'; | 
					
						
							| 
									
										
										
										
											2022-09-23 17:28:22 +08:00
										 |  |  | import 'package:flutter/material.dart'; | 
					
						
							|  |  |  | import 'package:get/get.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import '../../common.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Button extends StatefulWidget { | 
					
						
							| 
									
										
										
										
											2022-10-24 15:58:24 +08:00
										 |  |  |   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; | 
					
						
							| 
									
										
										
										
											2022-09-23 17:28:22 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   Button({ | 
					
						
							|  |  |  |     Key? key, | 
					
						
							|  |  |  |     this.minWidth, | 
					
						
							|  |  |  |     this.isOutline = false, | 
					
						
							| 
									
										
										
										
											2022-09-23 20:18:11 +08:00
										 |  |  |     this.textSize, | 
					
						
							|  |  |  |     this.padding, | 
					
						
							|  |  |  |     this.textColor, | 
					
						
							|  |  |  |     this.radius, | 
					
						
							|  |  |  |     this.borderColor, | 
					
						
							| 
									
										
										
										
											2022-09-23 17:28:22 +08:00
										 |  |  |     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( | 
					
						
							| 
									
										
										
										
											2022-09-23 20:18:11 +08:00
										 |  |  |                 minWidth: widget.minWidth ?? 70.0, | 
					
						
							| 
									
										
										
										
											2022-09-23 17:28:22 +08:00
										 |  |  |               ), | 
					
						
							|  |  |  |               child: Container( | 
					
						
							| 
									
										
										
										
											2022-09-23 20:18:11 +08:00
										 |  |  |                 padding: EdgeInsets.all(widget.padding ?? 4.5), | 
					
						
							| 
									
										
										
										
											2022-09-23 17:28:22 +08:00
										 |  |  |                 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 | 
					
						
							| 
									
										
										
										
											2022-09-23 20:18:11 +08:00
										 |  |  |                                 ? widget.borderColor ?? MyTheme.border | 
					
						
							| 
									
										
										
										
											2022-09-23 17:28:22 +08:00
										 |  |  |                                 : MyTheme.button), | 
					
						
							|  |  |  |                   ), | 
					
						
							| 
									
										
										
										
											2022-09-23 20:18:11 +08:00
										 |  |  |                   borderRadius: BorderRadius.circular(widget.radius ?? 5), | 
					
						
							| 
									
										
										
										
											2022-09-23 17:28:22 +08:00
										 |  |  |                 ), | 
					
						
							|  |  |  |                 child: Text( | 
					
						
							|  |  |  |                   translate( | 
					
						
							|  |  |  |                     widget.text, | 
					
						
							|  |  |  |                   ), | 
					
						
							|  |  |  |                   style: TextStyle( | 
					
						
							| 
									
										
										
										
											2022-09-23 20:18:11 +08:00
										 |  |  |                       fontSize: widget.textSize ?? 12.0, | 
					
						
							| 
									
										
										
										
											2022-09-27 19:42:05 +08:00
										 |  |  |                       color: widget.isOutline | 
					
						
							|  |  |  |                           ? widget.textColor ?? | 
					
						
							|  |  |  |                               Theme.of(context).textTheme.titleLarge?.color | 
					
						
							|  |  |  |                           : Colors.white), | 
					
						
							| 
									
										
										
										
											2022-09-23 17:28:22 +08:00
										 |  |  |                 ).marginSymmetric(horizontal: 12), | 
					
						
							|  |  |  |               )), | 
					
						
							|  |  |  |         )); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2022-10-24 15:58:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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), | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |               ], | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |           ), | 
					
						
							|  |  |  |         )); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |