You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			165 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Dart
		
	
		
		
			
		
	
	
			165 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Dart
		
	
|   
											2 months ago
										 | import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; | ||
|  | import 'package:flutter/material.dart'; | ||
|  | import 'package:flutter/services.dart'; | ||
|  | import 'package:hmg_patient_app_new/theme/colors.dart'; | ||
|  | import 'package:hmg_patient_app_new/extensions/int_extensions.dart'; | ||
|  | import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; | ||
|  | // import 'package:sizer/sizer.dart';
 | ||
|  | 
 | ||
|  | class CustomTextField extends StatefulWidget { | ||
|  |   final String labelText; | ||
|  |   final String? hintText; | ||
|  |   final TextEditingController controller; | ||
|  |   final VoidCallback? suffixTap; | ||
|  |   final IconData? suffixIcon; | ||
|  |   final bool isEnable; | ||
|  |   final bool hasSelection; | ||
|  |   final int? lines; | ||
|  |   final bool isInputTypeNum; | ||
|  |   final bool isTextIsPassword; | ||
|  |   final bool isBackgroundEnable; | ||
|  |   final bool isEnableBorder; | ||
|  |   final double verticalPadding; | ||
|  |   final double horizontalPadding; | ||
|  |   final Function(String)? onChange; | ||
|  |   final Function()? onEditComplete; | ||
|  |   final Function(String)? onSubmit; | ||
|  |   final Function? onClick; | ||
|  |   final FocusNode? focusNode; | ||
|  |   List<TextInputFormatter>? inputFormatters; | ||
|  | 
 | ||
|  |   CustomTextField( | ||
|  |     this.labelText, | ||
|  |     this.controller, { | ||
|  |     Key? key, | ||
|  |     this.isTextIsPassword = false, | ||
|  |     this.suffixTap, | ||
|  |     this.suffixIcon, | ||
|  |     this.hintText, | ||
|  |     this.isEnable = true, | ||
|  |     this.hasSelection = false, | ||
|  |     this.isEnableBorder = true, | ||
|  |     this.lines = 1, | ||
|  |     this.onChange, | ||
|  |     this.onEditComplete, | ||
|  |     this.onSubmit, | ||
|  |     this.onClick, | ||
|  |     this.isInputTypeNum = false, | ||
|  |     this.isBackgroundEnable = false, | ||
|  |     this.focusNode, | ||
|  |     this.verticalPadding = 15, | ||
|  |     this.horizontalPadding = 16, | ||
|  |     this.inputFormatters, | ||
|  |   }) : super(key: key); | ||
|  | 
 | ||
|  |   @override | ||
|  |   CustomTextFieldState createState() => CustomTextFieldState(); | ||
|  | } | ||
|  | 
 | ||
|  | class CustomTextFieldState extends State<CustomTextField> { | ||
|  |   late bool isObscureText; | ||
|  |   late FocusNode focusNode; | ||
|  | 
 | ||
|  |   @override | ||
|  |   void initState() { | ||
|  |     super.initState(); | ||
|  |     focusNode = FocusNode(); | ||
|  |     isObscureText = widget.isTextIsPassword; | ||
|  |   } | ||
|  | 
 | ||
|  |   @override | ||
|  |   void dispose() { | ||
|  |     super.dispose(); | ||
|  |   } | ||
|  | 
 | ||
|  |   @override | ||
|  |   Widget build(BuildContext context) { | ||
|  |     return InkWell( | ||
|  |       onTap: () { | ||
|  |         focusNode.requestFocus(); | ||
|  |         if (widget.hasSelection) widget.onClick!(); | ||
|  |       }, | ||
|  |       child: Container( | ||
|  |         padding: EdgeInsets.only(left: widget.horizontalPadding, right: widget.horizontalPadding, bottom: widget.verticalPadding, top: widget.verticalPadding), | ||
|  |         alignment: Alignment.center, | ||
|  |         decoration: BoxDecoration( | ||
|  |           borderRadius: BorderRadius.circular(15), | ||
|  |           color: widget.isBackgroundEnable ? const Color(0xffF7F7F7) : Colors.white, | ||
|  |           border: Border.all(color: widget.isEnableBorder ? Colors.grey.shade300 : Colors.transparent, width: 1), | ||
|  |         ), | ||
|  |         child: Row( | ||
|  |           children: [ | ||
|  |             Expanded( | ||
|  |               child: Column( | ||
|  |                 mainAxisSize: MainAxisSize.min, | ||
|  |                 crossAxisAlignment: CrossAxisAlignment.start, | ||
|  |                 mainAxisAlignment: MainAxisAlignment.start, | ||
|  |                 children: [ | ||
|  |                   Text( | ||
|  |                     widget.labelText, | ||
|  |                     style: TextStyle( | ||
|  |                       fontSize: 12.h, | ||
|  |                       fontWeight: FontWeight.w600, | ||
|  |                       color: const Color(0xff2B353E), | ||
|  |                       letterSpacing: -0.44, | ||
|  |                     ), | ||
|  |                   ), | ||
|  |                   TextField( | ||
|  |                     focusNode: focusNode, | ||
|  |                     autofocus: false, | ||
|  |                     enabled: widget.isEnable, | ||
|  |                     scrollPadding: EdgeInsets.zero, | ||
|  |                     keyboardType: widget.isInputTypeNum ? TextInputType.number : TextInputType.text, | ||
|  |                     controller: widget.controller, | ||
|  |                     maxLines: widget.lines, | ||
|  |                     obscuringCharacter: "*", | ||
|  |                     obscureText: isObscureText, | ||
|  |                     onChanged: widget.onChange, | ||
|  |                     onEditingComplete: widget.onEditComplete, | ||
|  |                     onSubmitted: widget.onSubmit, | ||
|  |                     inputFormatters: widget.inputFormatters, | ||
|  |                     style: const TextStyle( | ||
|  |                       fontSize: 16, | ||
|  |                       height: 21 / 14, | ||
|  |                       fontWeight: FontWeight.w400, | ||
|  |                       color: Color(0xff2B353E), | ||
|  |                       letterSpacing: -0.44, | ||
|  |                     ), | ||
|  |                     decoration: InputDecoration( | ||
|  |                       isDense: true, | ||
|  |                       hintText: widget.hintText, | ||
|  |                       hintStyle: const TextStyle( | ||
|  |                         fontSize: 14, | ||
|  |                         height: 21 / 14, | ||
|  |                         fontWeight: FontWeight.w400, | ||
|  |                         color: Color(0xff575757), | ||
|  |                         letterSpacing: -0.56, | ||
|  |                       ), | ||
|  |                       suffixIconConstraints: const BoxConstraints(minWidth: 50), | ||
|  |                       suffixIcon: widget.suffixTap == null ? null : IconButton(icon: Icon(Icons.mic, color: blackColor), onPressed: widget.suffixTap), | ||
|  |                       contentPadding: EdgeInsets.zero, | ||
|  |                       border: InputBorder.none, | ||
|  |                       focusedBorder: InputBorder.none, | ||
|  |                       enabledBorder: InputBorder.none, | ||
|  |                     ), | ||
|  |                   ), | ||
|  |                 ], | ||
|  |               ), | ||
|  |             ), | ||
|  |             if (widget.isTextIsPassword) ...[ | ||
|  |               16.width, | ||
|  |               Icon(isObscureText ? Icons.visibility_rounded : Icons.visibility_off_rounded).onPress(() { | ||
|  |                 setState(() { | ||
|  |                   isObscureText = !isObscureText; | ||
|  |                 }); | ||
|  |               }) | ||
|  |             ], | ||
|  |             if (widget.hasSelection) const Icon(Icons.keyboard_arrow_down_outlined), | ||
|  |             if (widget.suffixIcon != null && widget.suffixTap == null) Icon(widget.suffixIcon!), | ||
|  |           ], | ||
|  |         ), | ||
|  |       ), | ||
|  |     ); | ||
|  |   } | ||
|  | } |