app_textfield.dart 4.8 KB

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