123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- // ignore_for_file: must_be_immutable
- import 'package:flutter/material.dart';
- import 'package:flutter/services.dart';
- import 'package:intl/intl.dart';
- import '../themes/themes.dart';
- class AppTextField extends StatefulWidget {
- final bool separarMiles;
- final Icon? prefixIcon;
- final Widget? suffixIcon;
- final String? labelText;
- final String? initialValue;
- final String? hintText;
- final TextInputType? keyboardType;
- final TextEditingController? controller;
- final Color? fillColor;
- final void Function()? onTap;
- final bool enabled;
- final bool obscureText;
- final bool readOnly;
- final int? maxLength;
- final int? maxLines;
- final String? errorText;
- final double? textfieldHeight;
- final List<String>? autofillHints;
- List<TextInputFormatter>? inputFormatters;
- final TextCapitalization textCapitalization;
- String? etiqueta;
- String? Function(String?)? validator;
- final double? vertical;
- final Function(String v)? onChanged;
- final Function(String v)? onSubmitted;
- AppTextField({
- super.key,
- this.separarMiles = false,
- this.etiqueta,
- this.labelText,
- this.prefixIcon,
- this.keyboardType,
- this.onTap,
- this.controller,
- this.hintText,
- this.suffixIcon,
- this.inputFormatters,
- this.enabled = true,
- this.readOnly = false,
- this.obscureText = false,
- this.fillColor = Colors.white,
- this.errorText,
- this.textfieldHeight,
- this.textCapitalization = TextCapitalization.none,
- this.initialValue,
- this.maxLength,
- this.maxLines = 1,
- this.validator,
- this.onChanged,
- this.vertical,
- this.autofillHints,
- this.onSubmitted,
- });
- @override
- _AppTextFieldState createState() => _AppTextFieldState();
- }
- class _AppTextFieldState extends State<AppTextField> {
- bool isFirst = true;
- double _getFontSize(BuildContext context) {
- double screenWidth = MediaQuery.of(context).size.width;
- if (screenWidth < 480) {
- return 12;
- } else if (screenWidth < 800) {
- return 15;
- }
- return 18;
- }
- @override
- Widget build(BuildContext context) {
- double fontSize = _getFontSize(context);
- widget.etiqueta ??= "";
- return Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- if (widget.etiqueta != '')
- Text(
- widget.etiqueta!,
- style: TextStyle(
- fontSize: fontSize,
- fontWeight: FontWeight.bold,
- color: widget.enabled ? Colors.black : Colors.grey[700]),
- ),
- if (widget.etiqueta != '')
- const SizedBox(
- height: 5,
- ),
- TextFormField(
- onFieldSubmitted: widget.onSubmitted,
- autofillHints: widget.autofillHints,
- validator: widget.validator,
- enabled: widget.enabled,
- style: TextStyle(
- fontSize: fontSize,
- ),
- maxLength: widget.maxLength,
- maxLines: widget.maxLines,
- inputFormatters: widget.inputFormatters ??
- (widget.separarMiles
- ? [FilteringTextInputFormatter.digitsOnly]
- : null),
- initialValue: widget.initialValue,
- controller: widget.controller,
- onTap: widget.onTap,
- readOnly: widget.readOnly,
- keyboardType: widget.keyboardType,
- textCapitalization: widget.textCapitalization,
- cursorColor: AppTheme.tertiary,
- obscureText: widget.obscureText,
- autocorrect: true,
- onChanged: (value) {
- if (widget.separarMiles) {
- String newValue = value.replaceAll(',', '').replaceAll('.', '');
- if (value.isEmpty || newValue == '00') {
- widget.controller?.clear();
- isFirst = true;
- return;
- }
- double value1 = double.parse(newValue);
- if (!isFirst) value1 = value1 * 100;
- value = NumberFormat.currency(customPattern: '###,###.##')
- .format(value1 / 100);
- widget.controller?.value = TextEditingValue(
- text: value,
- selection: TextSelection.collapsed(offset: value.length),
- );
- } else if (widget.onChanged != null) {
- widget.onChanged!(value);
- }
- },
- decoration: InputDecoration(
- contentPadding: widget.vertical == null
- ? null
- : EdgeInsets.symmetric(vertical: widget.vertical!),
- focusedBorder: OutlineInputBorder(
- borderRadius: BorderRadius.circular(10),
- borderSide: BorderSide(
- color: AppTheme.tertiary,
- ),
- ),
- enabledBorder: OutlineInputBorder(
- borderRadius: BorderRadius.circular(10),
- borderSide: BorderSide(
- color: Colors.grey[400]!,
- ),
- ),
- errorBorder: OutlineInputBorder(
- borderRadius: BorderRadius.circular(10),
- borderSide: BorderSide(
- color: Colors.red[200]!,
- ),
- ),
- focusedErrorBorder: OutlineInputBorder(
- borderRadius: BorderRadius.circular(10),
- borderSide: const BorderSide(
- color: Colors.red,
- ),
- ),
- disabledBorder: OutlineInputBorder(
- borderRadius: BorderRadius.circular(10),
- borderSide: BorderSide(
- color: Colors.grey[200]!,
- ),
- ),
- errorText: widget.errorText,
- labelText: widget.labelText,
- hintText: widget.hintText,
- floatingLabelStyle: TextStyle(
- color: AppTheme.tertiary,
- fontSize: fontSize,
- ),
- filled: true,
- fillColor: widget.fillColor,
- prefixIcon: widget.prefixIcon,
- prefixIconColor: AppTheme.tertiary,
- suffixIcon: widget.suffixIcon,
- suffixIconColor: AppTheme.tertiary,
- border: OutlineInputBorder(
- borderRadius: BorderRadius.circular(15),
- borderSide: BorderSide.none,
- ),
- ),
- ),
- ],
- );
- }
- }
|