import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; ///自带删除的ITextField typedef void ITextFieldCallBack(String content); enum ITextInputType { text, multiline, number, phone, datetime, emailAddress, url, password } class ITextField extends StatefulWidget { final ITextInputType keyboardType; final int maxLines; final int maxLength; final String hintText; final TextStyle hintStyle; final ITextFieldCallBack fieldCallBack; final ITextFieldCallBack fieldSubmit; final Icon deleteIcon; final InputBorder inputBorder; final Widget prefixIcon; final TextStyle textStyle; final FormFieldValidator validator; final TextStyle counterStyle; final String inputText; final bool autofocus; final TextInputAction textInputAction; final EdgeInsetsGeometry contentPadding; final FocusNode focusNode; final GestureTapCallback fileOnTap; final bool hasCancel; ITextField( {Key key, ITextInputType keyboardType = ITextInputType.text, this.maxLines = 1, this.maxLength, this.hintText, this.hintStyle, this.fieldCallBack, this.fieldSubmit, this.deleteIcon, this.inputBorder, this.textStyle, this.prefixIcon, this.validator, this.counterStyle, this.inputText = '', this.autofocus = false, this.textInputAction, this.contentPadding, this.focusNode, this.fileOnTap, this.hasCancel = false}) : assert(maxLines == null || maxLines > 0), assert(maxLength == null || maxLength > 0), keyboardType = maxLines == 1 ? keyboardType : ITextInputType.multiline, super(key: key); @override State createState() => _ITextFieldState(); } class _ITextFieldState extends State { String _inputText = ''; bool _hasdeleteIcon = false; bool _isNumber = false; bool _isPassword = false; FocusNode _focusNode = FocusNode(); ///输入类型 TextInputType _getTextInputType() { switch (widget.keyboardType) { case ITextInputType.text: return TextInputType.text; case ITextInputType.multiline: return TextInputType.multiline; case ITextInputType.number: _isNumber = true; return TextInputType.number; case ITextInputType.phone: _isNumber = true; return TextInputType.phone; case ITextInputType.datetime: return TextInputType.datetime; case ITextInputType.emailAddress: return TextInputType.emailAddress; case ITextInputType.url: return TextInputType.url; case ITextInputType.password: _isPassword = true; return TextInputType.text; default: return TextInputType.text; } } ///输入范围 List _getTextInputFormatter() { return _isNumber ? [ WhitelistingTextInputFormatter.digitsOnly, ] : null; } @override void initState() { super.initState(); _inputText = widget.inputText != null ? widget.inputText : ''; if (widget.focusNode != null) { _focusNode = widget.focusNode; } _focusNode.addListener(() { if (!_focusNode.hasFocus) { setState(() { _hasdeleteIcon = false; }); } else { setState(() { _hasdeleteIcon = (_inputText.isNotEmpty); }); } }); } @override Widget build(BuildContext context) { TextEditingController _controller = TextEditingController.fromValue( TextEditingValue(text: _inputText, selection: TextSelection.fromPosition(TextPosition(affinity: TextAffinity.downstream, offset: _inputText.length)))); TextField textField = TextField( autofocus: widget.autofocus, focusNode: _focusNode, controller: _controller, textInputAction: widget.textInputAction, cursorColor: Theme.of(context).primaryColor, decoration: InputDecoration( counterStyle: widget.counterStyle, hintStyle: widget.hintStyle, hintText: widget.hintText, border: widget.inputBorder != null ? widget.inputBorder : UnderlineInputBorder(), fillColor: Colors.transparent, filled: true, prefixIcon: widget.prefixIcon, contentPadding: widget.contentPadding, suffixIcon: _hasdeleteIcon ? Container( width: 18.0, height: 18.0, child: IconButton( alignment: Alignment.center, padding: const EdgeInsets.all(2.0), iconSize: 18.0, icon: widget.deleteIcon != null ? widget.deleteIcon : Icon(Icons.cancel), color: Color(0xFf727785), onPressed: () { setState(() { _inputText = ''; _hasdeleteIcon = (_inputText.isNotEmpty); widget.fieldCallBack(_inputText); }); }, ), ) : Text(''), ), onChanged: (str) { setState(() { _inputText = str; _hasdeleteIcon = (_inputText.isNotEmpty); widget.fieldCallBack(_inputText); }); }, onSubmitted: (str) { setState(() { widget.fieldSubmit(str); }); }, keyboardType: _getTextInputType(), maxLength: widget.maxLength, maxLines: widget.maxLines, inputFormatters: _getTextInputFormatter(), style: widget.textStyle, obscureText: _isPassword, onTap: () { widget.fileOnTap(); }, ); if (!widget.hasCancel) { return textField; } else { return Row( children: [ Expanded( flex: 1, child: Container( height: 34, padding: EdgeInsets.fromLTRB(20, 0, 0, 0), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(100)), ), child: textField), ), InkWell( child: Container( padding: EdgeInsets.symmetric(horizontal: 15, vertical: 6), child: Text('取消', style: TextStyle(fontSize: 16, color: Colors.white)), ), onTap: () { Navigator.of(context).pop(true); // setState(() { // _inputText = ''; // _hasdeleteIcon = (_inputText.isNotEmpty); // widget.fieldCallBack(_inputText); // _focusNode.unfocus(); // }); }, ) ], ); } } }