import 'package:didvan/config/design_config.dart'; import 'package:didvan/widgets/didvan/text.dart'; import 'package:flutter/material.dart'; class DidvanTextField extends StatefulWidget { final void Function(String value)? onChanged; final bool enabled; final bool autoFocus; final TextAlign textAlign; final String? title; final String? hintText; final dynamic initialValue; final bool obsecureText; final String? Function(String? value)? validator; final TextInputType? textInputType; const DidvanTextField({ Key? key, this.onChanged, this.enabled = true, this.title, this.hintText, this.initialValue, this.validator, this.textInputType, this.textAlign = TextAlign.right, this.obsecureText = false, this.autoFocus = false, }) : super(key: key); @override State createState() => _DidvanTextFieldState(); } class _DidvanTextFieldState extends State { final FocusNode _focusNode = FocusNode(); final TextEditingController _controller = TextEditingController(); bool _hasError = false; bool _hideContent = false; @override void initState() { _hideContent = widget.obsecureText; _focusNode.addListener(() { setState(() {}); }); super.initState(); } @override Widget build(BuildContext context) { return Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ if (widget.title != null) DidvanText(widget.title!), if (widget.title != null) const SizedBox(height: 8), Container( padding: const EdgeInsets.symmetric(horizontal: 12).copyWith( left: widget.obsecureText ? 0 : 12, ), decoration: BoxDecoration( color: _fillColor(), borderRadius: DesignConfig.lowBorderRadius, border: Border.all(color: _borderColor()), ), child: TextFormField( autofocus: widget.autoFocus, obscureText: _hideContent, textAlign: widget.textAlign, keyboardType: widget.textInputType, focusNode: _focusNode, controller: _controller, onChanged: _onChanged, validator: _validator, obscuringCharacter: '*', style: Theme.of(context).textTheme.bodyText1, decoration: InputDecoration( suffixIcon: _suffixBuilder(), enabled: widget.enabled, border: InputBorder.none, hintText: widget.hintText, hintStyle: Theme.of(context) .textTheme .bodyText1! .copyWith(color: DesignConfig.greyColor5), ), ), ), ], ); } Color _borderColor() { if (_focusNode.hasFocus) { return Theme.of(context).primaryColor; } else if (_hasError) { return Theme.of(context).colorScheme.error; } return DesignConfig.greyColor4; } Color _fillColor() { if (_focusNode.hasFocus) { return DesignConfig.lightPrimaryColor3; } else if (_hasError) { return DesignConfig.lightRedColor; } return Theme.of(context).colorScheme.surface; } Widget? _suffixBuilder() { if (widget.obsecureText) { return FittedBox( fit: BoxFit.scaleDown, child: GestureDetector( onTap: () { setState(() { _hideContent = !_hideContent; }); }, child: Icon( _hideContent ? Icons.remove_red_eye : Icons.remove_red_eye_outlined, ), ), ); } } void _onChanged(String value) { if (widget.onChanged != null) { widget.onChanged!(value); } } String? _validator(String? value) { _hasError = false; } }