ITextInput.dart 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter/services.dart';
  3. ///自带删除的ITextField
  4. typedef void ITextFieldCallBack(String content);
  5. enum ITextInputType {
  6. text,
  7. multiline,
  8. number,
  9. phone,
  10. datetime,
  11. emailAddress,
  12. url,
  13. password
  14. }
  15. class ITextField extends StatefulWidget {
  16. final ITextInputType keyboardType;
  17. final int maxLines;
  18. final int maxLength;
  19. final String hintText;
  20. final TextStyle hintStyle;
  21. final ITextFieldCallBack fieldCallBack;
  22. final Icon deleteIcon;
  23. final InputBorder inputBorder;
  24. final Widget prefixIcon;
  25. final TextStyle textStyle;
  26. final FormFieldValidator<String> validator;
  27. final TextStyle counterStyle;
  28. final String inputText;
  29. final bool autofocus;
  30. ITextField(
  31. {Key key,
  32. ITextInputType keyboardType: ITextInputType.text,
  33. this.maxLines = 1,
  34. this.maxLength,
  35. this.hintText,
  36. this.hintStyle,
  37. this.fieldCallBack,
  38. this.deleteIcon,
  39. this.inputBorder,
  40. this.textStyle,
  41. this.prefixIcon,
  42. this.validator,
  43. this.counterStyle,
  44. this.inputText,
  45. this.autofocus=false})
  46. : assert(maxLines == null || maxLines > 0),
  47. assert(maxLength == null || maxLength > 0),
  48. keyboardType = maxLines == 1 ? keyboardType : ITextInputType.multiline,
  49. super(key: key);
  50. @override
  51. State<StatefulWidget> createState() => _ITextFieldState();
  52. }
  53. class _ITextFieldState extends State<ITextField> {
  54. String _inputText = '';
  55. bool _hasdeleteIcon = false;
  56. bool _isNumber = false;
  57. bool _isPassword = false;
  58. FocusNode _focusNode = FocusNode();
  59. ///输入类型
  60. TextInputType _getTextInputType() {
  61. switch (widget.keyboardType) {
  62. case ITextInputType.text:
  63. return TextInputType.text;
  64. case ITextInputType.multiline:
  65. return TextInputType.multiline;
  66. case ITextInputType.number:
  67. _isNumber = true;
  68. return TextInputType.number;
  69. case ITextInputType.phone:
  70. _isNumber = true;
  71. return TextInputType.phone;
  72. case ITextInputType.datetime:
  73. return TextInputType.datetime;
  74. case ITextInputType.emailAddress:
  75. return TextInputType.emailAddress;
  76. case ITextInputType.url:
  77. return TextInputType.url;
  78. case ITextInputType.password:
  79. _isPassword = true;
  80. return TextInputType.text;
  81. }
  82. }
  83. ///输入范围
  84. List<TextInputFormatter> _getTextInputFormatter() {
  85. return _isNumber
  86. ? <TextInputFormatter>[
  87. WhitelistingTextInputFormatter.digitsOnly,
  88. ]
  89. : null;
  90. }
  91. @override
  92. void initState() {
  93. super.initState();
  94. _inputText = widget.inputText != null ? widget.inputText : '';
  95. _focusNode.addListener(() {
  96. if (!_focusNode.hasFocus) {
  97. setState(() {
  98. _hasdeleteIcon = false;
  99. });
  100. } else {
  101. setState(() {
  102. _hasdeleteIcon = (_inputText.isNotEmpty);
  103. });
  104. }
  105. });
  106. }
  107. @override
  108. Widget build(BuildContext context) {
  109. TextEditingController _controller = new TextEditingController.fromValue(
  110. TextEditingValue(
  111. text: _inputText,
  112. selection: new TextSelection.fromPosition(TextPosition(
  113. affinity: TextAffinity.downstream,
  114. offset: _inputText.length))));
  115. TextField textField = new TextField(
  116. autofocus: widget.autofocus,
  117. focusNode: _focusNode,
  118. controller: _controller,
  119. decoration: InputDecoration(
  120. counterStyle: widget.counterStyle,
  121. hintStyle: widget.hintStyle,
  122. hintText: widget.hintText,
  123. border: widget.inputBorder != null
  124. ? widget.inputBorder
  125. : UnderlineInputBorder(),
  126. fillColor: Colors.transparent,
  127. filled: true,
  128. prefixIcon: widget.prefixIcon,
  129. suffixIcon: _hasdeleteIcon
  130. ? new Container(
  131. width: 20.0,
  132. height: 20.0,
  133. child: new IconButton(
  134. alignment: Alignment.center,
  135. padding: const EdgeInsets.all(0.0),
  136. iconSize: 18.0,
  137. icon: widget.deleteIcon != null
  138. ? widget.deleteIcon
  139. : Icon(Icons.cancel),
  140. onPressed: () {
  141. setState(() {
  142. _inputText = "";
  143. _hasdeleteIcon = (_inputText.isNotEmpty);
  144. widget.fieldCallBack(_inputText);
  145. });
  146. },
  147. ),
  148. )
  149. : new Text(""),
  150. ),
  151. onChanged: (str) {
  152. setState(() {
  153. _inputText = str;
  154. _hasdeleteIcon = (_inputText.isNotEmpty);
  155. widget.fieldCallBack(_inputText);
  156. });
  157. },
  158. keyboardType: _getTextInputType(),
  159. maxLength: widget.maxLength,
  160. maxLines: widget.maxLines,
  161. inputFormatters: _getTextInputFormatter(),
  162. style: widget.textStyle,
  163. obscureText: _isPassword,
  164. );
  165. return textField;
  166. }
  167. }