app_textfield.dart 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. // ignore_for_file: must_be_immutable
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter/services.dart';
  4. import 'package:intl/intl.dart';
  5. import '../themes.dart';
  6. class AppTextField extends StatefulWidget {
  7. final bool separarMiles;
  8. final Icon? prefixIcon;
  9. final Widget? suffixIcon;
  10. final String? labelText;
  11. final String? initialValue;
  12. final String? hintText;
  13. final TextInputType? keyboardType;
  14. final TextEditingController? controller;
  15. final Color? fillColor;
  16. final void Function()? onTap;
  17. final bool enabled;
  18. final bool obscureText;
  19. final bool readOnly;
  20. final int? maxLength;
  21. final int? maxLines;
  22. final String? errorText;
  23. final double? textfieldHeight;
  24. final List<String>? autofillHints;
  25. List<TextInputFormatter>? inputFormatters;
  26. final TextCapitalization textCapitalization;
  27. String? etiqueta;
  28. String? Function(String?)? validator;
  29. final double? vertical;
  30. final Function(String v)? onChanged;
  31. final Function(String v)? onSubmitted;
  32. AppTextField({
  33. super.key,
  34. this.separarMiles = false,
  35. this.etiqueta,
  36. this.labelText,
  37. this.prefixIcon,
  38. this.keyboardType,
  39. this.onTap,
  40. this.controller,
  41. this.hintText,
  42. this.suffixIcon,
  43. this.inputFormatters,
  44. this.enabled = true,
  45. this.readOnly = false,
  46. this.obscureText = false,
  47. this.fillColor = Colors.white,
  48. this.errorText,
  49. this.textfieldHeight,
  50. this.textCapitalization = TextCapitalization.none,
  51. this.initialValue,
  52. this.maxLength,
  53. this.maxLines = 1,
  54. this.validator,
  55. this.onChanged,
  56. this.vertical,
  57. this.autofillHints,
  58. this.onSubmitted,
  59. });
  60. @override
  61. _AppTextFieldState createState() => _AppTextFieldState();
  62. }
  63. class _AppTextFieldState extends State<AppTextField> {
  64. bool isFirst = true;
  65. double _getFontSize(BuildContext context) {
  66. double screenWidth = MediaQuery.of(context).size.width;
  67. if (screenWidth < 480) {
  68. return 12;
  69. } else if (screenWidth < 800) {
  70. return 15;
  71. }
  72. return 18;
  73. }
  74. @override
  75. Widget build(BuildContext context) {
  76. double fontSize = _getFontSize(context);
  77. widget.etiqueta ??= "";
  78. return Column(
  79. crossAxisAlignment: CrossAxisAlignment.start,
  80. children: [
  81. if (widget.etiqueta != '')
  82. Text(
  83. widget.etiqueta!,
  84. style: TextStyle(
  85. fontSize: fontSize,
  86. fontWeight: FontWeight.bold,
  87. color: widget.enabled ? Colors.black : Colors.grey[700]),
  88. ),
  89. if (widget.etiqueta != '')
  90. const SizedBox(
  91. height: 5,
  92. ),
  93. TextFormField(
  94. onFieldSubmitted: widget.onSubmitted,
  95. autofillHints: widget.autofillHints,
  96. validator: widget.validator,
  97. enabled: widget.enabled,
  98. style: TextStyle(
  99. fontSize: fontSize,
  100. ),
  101. maxLength: widget.maxLength,
  102. maxLines: widget.maxLines,
  103. inputFormatters: widget.inputFormatters ??
  104. (widget.separarMiles
  105. ? [FilteringTextInputFormatter.digitsOnly]
  106. : null),
  107. initialValue: widget.initialValue,
  108. controller: widget.controller,
  109. onTap: widget.onTap,
  110. readOnly: widget.readOnly,
  111. keyboardType: widget.keyboardType,
  112. textCapitalization: widget.textCapitalization,
  113. cursorColor: AppTheme.tertiary,
  114. obscureText: widget.obscureText,
  115. autocorrect: true,
  116. onChanged: (value) {
  117. if (widget.separarMiles) {
  118. String newValue = value.replaceAll(',', '').replaceAll('.', '');
  119. if (value.isEmpty || newValue == '00') {
  120. widget.controller?.clear();
  121. isFirst = true;
  122. return;
  123. }
  124. double value1 = double.parse(newValue);
  125. if (!isFirst) value1 = value1 * 100;
  126. value = NumberFormat.currency(customPattern: '###,###.##')
  127. .format(value1 / 100);
  128. widget.controller?.value = TextEditingValue(
  129. text: value,
  130. selection: TextSelection.collapsed(offset: value.length),
  131. );
  132. }
  133. if (widget.onChanged != null) {
  134. widget.onChanged!(value);
  135. }
  136. },
  137. decoration: InputDecoration(
  138. contentPadding: widget.vertical == null
  139. ? null
  140. : EdgeInsets.symmetric(vertical: widget.vertical!),
  141. focusedBorder: OutlineInputBorder(
  142. borderRadius: BorderRadius.circular(10),
  143. borderSide: BorderSide(
  144. color: AppTheme.tertiary,
  145. ),
  146. ),
  147. enabledBorder: OutlineInputBorder(
  148. borderRadius: BorderRadius.circular(10),
  149. borderSide: BorderSide(
  150. color: Colors.grey[400]!,
  151. ),
  152. ),
  153. errorBorder: OutlineInputBorder(
  154. borderRadius: BorderRadius.circular(10),
  155. borderSide: BorderSide(
  156. color: Colors.red[200]!,
  157. ),
  158. ),
  159. focusedErrorBorder: OutlineInputBorder(
  160. borderRadius: BorderRadius.circular(10),
  161. borderSide: const BorderSide(
  162. color: Colors.red,
  163. ),
  164. ),
  165. disabledBorder: OutlineInputBorder(
  166. borderRadius: BorderRadius.circular(10),
  167. borderSide: BorderSide(
  168. color: Colors.grey[200]!,
  169. ),
  170. ),
  171. errorText: widget.errorText,
  172. labelText: widget.labelText,
  173. hintText: widget.hintText,
  174. floatingLabelStyle: TextStyle(
  175. color: AppTheme.tertiary,
  176. fontSize: fontSize,
  177. ),
  178. filled: true,
  179. fillColor: widget.fillColor,
  180. prefixIcon: widget.prefixIcon,
  181. prefixIconColor: AppTheme.tertiary,
  182. suffixIcon: widget.suffixIcon,
  183. suffixIconColor: AppTheme.tertiary,
  184. border: OutlineInputBorder(
  185. borderRadius: BorderRadius.circular(15),
  186. borderSide: BorderSide.none,
  187. ),
  188. ),
  189. ),
  190. ],
  191. );
  192. }
  193. }