You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

228 lines
7.5KB

  1. import 'package:farm_tpf/themes/app_dimension.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter/services.dart';
  4. import 'package:flutter_svg/svg.dart';
  5. import '../../../themes/app_colors.dart';
  6. import '../../../themes/styles_text.dart';
  7. import '../../../utils/app_images.dart';
  8. import '../../../utils/validators.dart';
  9. class TextFieldNormal extends StatefulWidget {
  10. final TextEditingController controller;
  11. final Function(String)? onFieldSubmitted;
  12. final Function(String)? onChanged;
  13. final FormFieldValidator<String>? validator;
  14. final String hint;
  15. final FocusNode? focusNode;
  16. final TextInputType? keyboardType;
  17. final TextInputAction? textInputAction;
  18. final List<TextInputFormatter>? inputFormatters;
  19. final bool? obscureText;
  20. final String? errorText;
  21. final Color? borderColor;
  22. final bool? isPasswordField;
  23. final Widget? prefixIcon;
  24. final String? prefixText;
  25. final int? maxLength;
  26. final bool? disabled;
  27. final TextCapitalization? textCapitalization;
  28. final String? suffixText;
  29. final HexColor? disableColor;
  30. final InputBorder? customBorder;
  31. final int? maxLines;
  32. final bool? autofocus;
  33. TextFieldNormal({
  34. required this.controller,
  35. required this.hint,
  36. this.validator,
  37. this.onFieldSubmitted,
  38. this.focusNode,
  39. this.keyboardType,
  40. this.textInputAction,
  41. this.inputFormatters,
  42. this.obscureText,
  43. this.errorText,
  44. this.onChanged,
  45. this.borderColor,
  46. this.isPasswordField,
  47. this.prefixIcon,
  48. this.maxLength,
  49. this.disabled,
  50. this.textCapitalization,
  51. this.suffixText,
  52. this.disableColor,
  53. this.prefixText,
  54. this.customBorder,
  55. this.maxLines,
  56. this.autofocus,
  57. });
  58. @override
  59. _TextFieldNormalState createState() => _TextFieldNormalState();
  60. }
  61. class _TextFieldNormalState extends State<TextFieldNormal> {
  62. var isObscureText = false;
  63. late HexColor disableColor;
  64. final _errorMessage = ValueNotifier('');
  65. @override
  66. void initState() {
  67. super.initState();
  68. isObscureText = widget.isPasswordField ?? false;
  69. disableColor = widget.disableColor ?? AppColors.white;
  70. }
  71. @override
  72. Widget build(BuildContext context) {
  73. return Column(
  74. crossAxisAlignment: CrossAxisAlignment.start,
  75. children: [
  76. TextFormField(
  77. keyboardType: widget.keyboardType ?? TextInputType.text,
  78. textInputAction: widget.textInputAction ?? TextInputAction.done,
  79. inputFormatters: widget.inputFormatters,
  80. obscureText: isObscureText,
  81. controller: widget.controller,
  82. validator: onValidator,
  83. onFieldSubmitted: widget.onFieldSubmitted,
  84. focusNode: widget.focusNode,
  85. autocorrect: false,
  86. autofocus: widget.autofocus ?? false,
  87. onChanged: widget.onChanged,
  88. maxLength: widget.maxLength,
  89. style: StylesText.body6,
  90. maxLines: widget.maxLines ?? 1,
  91. autovalidateMode: AutovalidateMode.disabled,
  92. enabled: widget.disabled != true,
  93. textCapitalization: widget.textCapitalization ?? TextCapitalization.none,
  94. decoration: InputDecoration(
  95. contentPadding: const EdgeInsets.symmetric(horizontal: 12, vertical: 16),
  96. isDense: true,
  97. counterText: '',
  98. suffixText: widget.suffixText,
  99. suffixIconConstraints: BoxConstraints(maxHeight: 20),
  100. suffixIcon: widget.isPasswordField != null
  101. ? Padding(
  102. padding: const EdgeInsetsDirectional.only(end: 20.0),
  103. child: InkWell(
  104. onTap: () {
  105. setState(
  106. () {
  107. isObscureText = !isObscureText;
  108. },
  109. );
  110. },
  111. child: isObscureText
  112. ? SizedBox(
  113. width: 20.w,
  114. height: 20.h,
  115. child: SvgPicture.asset(
  116. AssetSVG.eye,
  117. ),
  118. )
  119. : SizedBox(
  120. width: 20.w,
  121. height: 20.h,
  122. child: SvgPicture.asset(
  123. AssetSVG.eyeOff,
  124. ),
  125. ),
  126. ),
  127. )
  128. : Padding(
  129. padding: const EdgeInsetsDirectional.only(end: 8.0),
  130. child: Text(
  131. '',
  132. style: StylesText.body3,
  133. ),
  134. ),
  135. enabledBorder: widget.customBorder ??
  136. OutlineInputBorder(
  137. borderRadius: BorderRadius.circular(12),
  138. borderSide: BorderSide(
  139. color: widget.borderColor ?? AppColors.neutral4,
  140. width: 1,
  141. ),
  142. ),
  143. focusedBorder: widget.customBorder ??
  144. OutlineInputBorder(
  145. borderRadius: BorderRadius.circular(12),
  146. borderSide: BorderSide(
  147. color: widget.borderColor ?? AppColors.neutral4,
  148. width: 1,
  149. ),
  150. ),
  151. errorBorder: OutlineInputBorder(
  152. borderRadius: BorderRadius.circular(12),
  153. borderSide: BorderSide(
  154. color: widget.borderColor ?? AppColors.semantic6,
  155. width: 1,
  156. ),
  157. ),
  158. focusedErrorBorder: OutlineInputBorder(
  159. borderRadius: BorderRadius.circular(12),
  160. borderSide: BorderSide(
  161. color: widget.borderColor ?? AppColors.semantic6,
  162. width: 1,
  163. ),
  164. ),
  165. disabledBorder: OutlineInputBorder(
  166. borderRadius: BorderRadius.circular(12),
  167. borderSide: BorderSide(
  168. color: widget.borderColor ?? AppColors.neutral4,
  169. width: 1,
  170. ),
  171. ),
  172. hintText: widget.hint,
  173. hintStyle: StylesText.body6.copyWith(
  174. color: AppColors.neutral3,
  175. ),
  176. errorStyle: const TextStyle(fontSize: 0, height: 0),
  177. fillColor: (widget.disabled ?? false) ? AppColors.background1.withOpacity(0.1) : AppColors.white,
  178. filled: true,
  179. ),
  180. ),
  181. ValueListenableBuilder<String>(
  182. valueListenable: _errorMessage,
  183. builder: (context, message, _) {
  184. if (Validators.stringNotNullOrEmpty(message)) {
  185. return Padding(
  186. padding: const EdgeInsets.only(top: 0.0),
  187. child: Row(
  188. children: [
  189. SvgPicture.asset(AssetSVG.icWarning),
  190. const SizedBox(
  191. width: 4,
  192. ),
  193. Text(
  194. message,
  195. style: StylesText.caption3.copyWith(
  196. color: AppColors.semantic6,
  197. ),
  198. ),
  199. ],
  200. ),
  201. );
  202. } else {
  203. return const SizedBox.shrink();
  204. }
  205. },
  206. ),
  207. ],
  208. );
  209. }
  210. String? onValidator(String? value) {
  211. if (widget.validator != null) {
  212. _errorMessage.value = widget.validator!(value!) ?? '';
  213. return widget.validator!(value);
  214. } else {
  215. _errorMessage.value = '';
  216. return null;
  217. }
  218. }
  219. }