Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

283 linhas
5.6 KiB

  1. import 'package:flutter/material.dart';
  2. import 'package:michele_s_application8/core/app_export.dart';
  3. class CustomButton extends StatelessWidget {
  4. CustomButton(
  5. {this.shape,
  6. this.padding,
  7. this.variant,
  8. this.fontStyle,
  9. this.alignment,
  10. this.margin,
  11. this.onTap,
  12. this.width,
  13. this.height,
  14. this.text,
  15. this.prefixWidget,
  16. this.suffixWidget});
  17. ButtonShape? shape;
  18. ButtonPadding? padding;
  19. ButtonVariant? variant;
  20. ButtonFontStyle? fontStyle;
  21. Alignment? alignment;
  22. EdgeInsetsGeometry? margin;
  23. VoidCallback? onTap;
  24. double? width;
  25. double? height;
  26. String? text;
  27. Widget? prefixWidget;
  28. Widget? suffixWidget;
  29. @override
  30. Widget build(BuildContext context) {
  31. return alignment != null
  32. ? Align(
  33. alignment: alignment!,
  34. child: _buildButtonWidget(),
  35. )
  36. : _buildButtonWidget();
  37. }
  38. _buildButtonWidget() {
  39. return Padding(
  40. padding: margin ?? EdgeInsets.zero,
  41. child: TextButton(
  42. onPressed: onTap,
  43. style: _buildTextButtonStyle(),
  44. child: _buildButtonChildWidget(),
  45. ),
  46. );
  47. }
  48. _buildButtonChildWidget() {
  49. if (checkGradient()) {
  50. return Container(
  51. width: width ?? double.maxFinite,
  52. padding: _setPadding(),
  53. decoration: _buildDecoration(),
  54. child: _buildButtonWithOrWithoutIcon(),
  55. );
  56. } else {
  57. return _buildButtonWithOrWithoutIcon();
  58. }
  59. }
  60. _buildButtonWithOrWithoutIcon() {
  61. if (prefixWidget != null || suffixWidget != null) {
  62. return Row(
  63. mainAxisAlignment: MainAxisAlignment.center,
  64. children: [
  65. prefixWidget ?? SizedBox(),
  66. Text(
  67. text ?? "",
  68. textAlign: TextAlign.center,
  69. style: _setFontStyle(),
  70. ),
  71. suffixWidget ?? SizedBox(),
  72. ],
  73. );
  74. } else {
  75. return Text(
  76. text ?? "",
  77. textAlign: TextAlign.center,
  78. style: _setFontStyle(),
  79. );
  80. }
  81. }
  82. _buildDecoration() {
  83. return BoxDecoration(
  84. borderRadius: _setBorderRadius(),
  85. gradient: _setGradient(),
  86. boxShadow: _setBoxShadow(),
  87. );
  88. }
  89. _buildTextButtonStyle() {
  90. if (checkGradient()) {
  91. return TextButton.styleFrom(
  92. padding: EdgeInsets.zero,
  93. );
  94. } else {
  95. return TextButton.styleFrom(
  96. fixedSize: Size(
  97. width ?? double.maxFinite,
  98. height ?? getVerticalSize(40),
  99. ),
  100. padding: _setPadding(),
  101. shadowColor: _setTextButtonShadowColor(),
  102. shape: RoundedRectangleBorder(
  103. borderRadius: _setBorderRadius(),
  104. ),
  105. );
  106. }
  107. }
  108. _setPadding() {
  109. switch (padding) {
  110. case ButtonPadding.PaddingAll9:
  111. return getPadding(
  112. all: 9,
  113. );
  114. default:
  115. return getPadding(
  116. all: 15,
  117. );
  118. }
  119. }
  120. _setTextButtonShadowColor() {
  121. switch (variant) {
  122. case ButtonVariant.OutlineBlack9003f:
  123. return ColorConstant.black9003f;
  124. default:
  125. return null;
  126. }
  127. }
  128. _setBorderRadius() {
  129. switch (shape) {
  130. case ButtonShape.Square:
  131. return BorderRadius.circular(0);
  132. default:
  133. return BorderRadius.circular(
  134. getHorizontalSize(
  135. 14.00,
  136. ),
  137. );
  138. }
  139. }
  140. _setFontStyle() {
  141. switch (fontStyle) {
  142. default:
  143. return TextStyle(
  144. color: ColorConstant.whiteA700,
  145. fontSize: getFontSize(
  146. 24,
  147. ),
  148. fontFamily: 'Roboto',
  149. fontWeight: FontWeight.w600,
  150. height: getVerticalSize(
  151. 1.21,
  152. ),
  153. );
  154. }
  155. }
  156. checkGradient() {
  157. switch (variant) {
  158. case ButtonVariant.OutlineBlack9003f:
  159. case ButtonVariant.GradientGray5008eBluegray400af:
  160. return true;
  161. default:
  162. return true;
  163. }
  164. }
  165. _setGradient() {
  166. switch (variant) {
  167. case ButtonVariant.OutlineBlack9003f:
  168. return LinearGradient(
  169. begin: Alignment(
  170. 0.5,
  171. 0,
  172. ),
  173. end: Alignment(
  174. 0.5,
  175. 1.11,
  176. ),
  177. colors: [
  178. ColorConstant.blueA400,
  179. ColorConstant.blue600E8,
  180. ],
  181. );
  182. case ButtonVariant.GradientGray5008eBluegray400af:
  183. return LinearGradient(
  184. begin: Alignment(
  185. 0.5,
  186. 0,
  187. ),
  188. end: Alignment(
  189. 0.5,
  190. 1,
  191. ),
  192. colors: [
  193. ColorConstant.gray5008e,
  194. ColorConstant.blueGray400Af,
  195. ],
  196. );
  197. default:
  198. return LinearGradient(
  199. begin: Alignment(
  200. 0.5,
  201. 0,
  202. ),
  203. end: Alignment(
  204. 0.5,
  205. 1,
  206. ),
  207. colors: [
  208. ColorConstant.redA7008e,
  209. ColorConstant.redA700Af,
  210. ],
  211. );
  212. }
  213. }
  214. _setBoxShadow() {
  215. switch (variant) {
  216. case ButtonVariant.OutlineBlack9003f:
  217. return [
  218. BoxShadow(
  219. color: ColorConstant.black9003f,
  220. spreadRadius: getHorizontalSize(
  221. 2.00,
  222. ),
  223. blurRadius: getHorizontalSize(
  224. 2.00,
  225. ),
  226. offset: Offset(
  227. 0,
  228. 2.65,
  229. ),
  230. )
  231. ];
  232. default:
  233. return null;
  234. }
  235. }
  236. }
  237. enum ButtonShape {
  238. Square,
  239. RoundedBorder14,
  240. }
  241. enum ButtonPadding {
  242. PaddingAll15,
  243. PaddingAll9,
  244. }
  245. enum ButtonVariant {
  246. GradientRedA7008eRedA700af,
  247. OutlineBlack9003f,
  248. GradientGray5008eBluegray400af,
  249. }
  250. enum ButtonFontStyle {
  251. RobotoRomanSemiBold24,
  252. }