Hello,你們好這裏是一個苦逼的前Android
開發,原本Android
乾的開開心心,可是受到一些影響轉行了😂,不過我就是吃不起飯,找不到工做也不會放棄Android
開發!,Flutter
真香!!我我的自學Flutter
以來受到了諸多大佬文章的啓迪,因此也萌生了寫一下分享文章給一樣須要幫助的同窗們。api
TextField
文本輸入框相信你們都不陌生,本篇文章帶你更加仔細的學習TextField
的一切。bash
建議閱讀時間: 沒事能夠多來看看啊😂ide
Widget build(BuildContext context) {
return Container(child: TextField());
}
複製代碼
大功告成?naive,這段代碼收穫的是一段報錯,提煉以後的報錯信息學習
I/flutter ( 7877): No Material widget found.`
I/flutter ( 7877): TextField widgets require a Material widget ancestor.
I/flutter ( 7877): Material itself, such as a Card, Dialog, Drawer, or Scaffold.
複製代碼
這個錯誤很好解決,TextField
須要被Material
組件包裹才能使用,咱們能夠用Card
,Dialog
,Drawer
,Scaffold
,甚至直接用Material
。可是咱們不須要直接包裹住,只要TextField
渲染時向上查找能夠找到Material
組件就ok。 ui
const TextField({
Key key,
this.controller,
this.focusNode,
this.decoration = const InputDecoration(),
TextInputType keyboardType,
this.textInputAction,
this.textCapitalization = TextCapitalization.none,
this.style,
this.textAlign = TextAlign.start,
this.textDirection,
this.autofocus = false,
this.obscureText = false,
this.autocorrect = true,
this.maxLines = 1,
this.maxLength,
this.maxLengthEnforced = true,
this.onChanged,
this.onEditingComplete,
this.onSubmitted,
this.inputFormatters,
this.enabled,
this.cursorWidth = 2.0,
this.cursorRadius,
this.cursorColor,
this.keyboardAppearance,
this.scrollPadding = const EdgeInsets.all(20.0),
this.dragStartBehavior = DragStartBehavior.down,
this.enableInteractiveSelection,
this.onTap,
this.buildCounter,
})
複製代碼
inputFormatters
inputFormatters: [LengthLimitingTextInputFormatter(20)]
複製代碼
inputFormatters
用來限制輸入內容,咱們能夠自定義一個只接受輸入數字內容的inputFormatters
this
class NumberFormatter extends TextInputFormatter {
bool isNumber(String value) {
return RegExp('^[0-9]*\$').hasMatch(value);
}
@override
TextEditingValue formatEditUpdate(
TextEditingValue oldValue, TextEditingValue newValue) {
String value = newValue.text;
return isNumber(value) ? newValue : oldValue;
}
}
複製代碼
obscureText
用來隱藏輸入內容,通常輸入密碼時須要設置這個屬性。autofocus
用來設置是否自動獲取焦點,默認爲false
。注意:設置focusNode
後此屬性失效。focusNode
用來控制TextField
焦點,也可控制軟鍵盤彈出隱藏~
若是一個頁面有多個TextField
還能夠用focusNode
來控制具體哪個TextField
獲取焦點
focusNode
還能夠獲取焦點狀態~FocusNode focusNode = FocusNode();
focusNode.addListener(() {
if (focusNode.hasFocus)
print('得到焦點');
else
print('失去焦點');
});
複製代碼
cursorWidth
設置光標寬度cursorRadius
設置光標圓角cursorColor
設置光標顏色enabled
是否禁用輸入框enableInteractiveSelection
值爲true
時能夠長按選擇複製粘貼,false
時禁用。onTap
單擊輸入框的回調TextField(
onTap: () {
print('onTap()');
}
//單擊時
I/flutter (14649): onTap()
I/flutter (14649): onTap()
複製代碼
onSubmitted
點擊軟鍵盤確認按鈕的回調 注意這裏的確承認以是done
、search
、go
等TextField(
onSubmitted: (value) {
print('value:' + value);
})
I/flutter (14978): value:蘇武難飛
I/flutter (14978): value:蘇武難飛
複製代碼
還須要注意的一點就是單獨註冊onSubmitted
時點擊後會關閉軟鍵盤~spa
onEditingComplete
點擊軟鍵盤確認按鈕的回調😂 這個方法和上面的onSubmitted
區別在於value
回調TextField
一個負責用戶名一個負責密碼,用戶輸入完用戶名後能夠很天然的點擊軟鍵盤的按鈕使焦點聚焦於密碼框。TextField(
onEditingComplete: () {
print('onEditingComplete()');
FocusScope.of(context).requestFocus(focusNode);
},
textInputAction: TextInputAction.next),
TextField(focusNode: focusNode)
I/flutter (15170): onEditingComplete()
I/flutter (15170): onEditingComplete()
複製代碼
textInputAction
用來設置軟鍵盤圖標能夠設置爲Search
、Next
、go
、previous
等等,須要注意的是部分InputAction
可能只有Android
平臺有,部分InputAction
可能只有iOS
平臺有。textCapitalization
用來控制用戶輸入文字大小寫
textAlign
文本對齊方式 這個其實很好理解,就像原生Android
中的Gravity
,本章節就拿center
舉一個小例子。
textDirection
控制文本方向style
逐漸到了重頭戲了嗷~,style
用來控制輸入文本樣式舉個栗子 3d
decoration
用來控制輸入框樣式 咱們先來作一個很是Material Design
的輸入框~TextField(
decoration: InputDecoration(labelText: 'Name')
)
複製代碼
InputDecoration
功能是很是豐富的,咱們還能夠添加
border
屬性來讓咱們輸入框更加有
Material
感受。
OutlineInputBorder
TextField(
decoration: InputDecoration(labelText: 'Name',border:OutlineInputBorder())
)
複製代碼
TextField(
decoration: InputDecoration(hintText: 'Name',border: OutlineInputBorder(borderRadius:BorderRadius.all(Radius.circular(16.0)))))
複製代碼
TextField(
decoration: InputDecoration(
labelText: 'Name',
labelStyle: TextStyle(color: Colors.red),
focusedBorder: OutlineInputBorder(
borderSide: const BorderSide(color:Colors.red)),
enabledBorder: OutlineInputBorder(
borderSide: const BorderSide(color:Colors.red))))
複製代碼
注意:單獨更改
border
是不生效的,會被
enabledBorder
和
focusedBorder
所覆蓋。
Theme
更改Theme(
data: ThemeData(primaryColor: Colors.red),
child: TextField(
decoration: InputDecoration(
labelText: 'Name', border: OutlineInputBorder())),
)
複製代碼
TextField(
decoration: InputDecoration(
labelText: 'Name',
labelStyle: TextStyle(color: Colors.red),
focusedBorder: OutlineInputBorder(
borderSide: const BorderSide(
color: Colors.red, width: 3.0)),
enabledBorder: OutlineInputBorder(
borderSide: const BorderSide(
color: Colors.red, width: 3.0))))
複製代碼
UnderlineInputBorder
表現形式與默認的樣式相同,更改顏色和圓角粗細也與OutlineInputBorder
一致~code
suffixIcon
能夠用來作清空輸入框的×
errorText
與
helperText
都有內容時,只有
errorText
會生效
Flutter
中的TextField
默認表現輸入形式是單行輸入,若是咱們設置了maxLines
呢?請看圖😂~ orm
maxLines
以後總體的高度都被放大了,這顯然不是咱們想要的效果,咱們想要的應該是輸入超出一行後會自動換行,像原生
Android
的
EditText
同樣,怎麼作呢,其實也很簡單,看圖┗|`O′|┛ 嗷~~
如何處理文本輸入呢,咱們有兩個辦法。
onChanged
回調每當用戶輸入時,TextField會調用它的onChanged回調。 您能夠處理此回調以查看用戶輸入的內容。例如,若是您正在輸入搜索字段,則可能須要在用戶輸入時更新搜索結果。
TextField(onChanged: (value) {
print('value: ${value}');
}
I/flutter (23802): value:蘇
I/flutter (23802): value:蘇武
I/flutter (23802): value:蘇武難
I/flutter (23802): value:蘇武難飛
複製代碼
一個更強大(但更精細)的方法是提供一個TextEditingController做爲TextField的controller屬性。 在用戶輸入時,controller的text和selection屬性不斷的更新。要在這些屬性更改時獲得通知,請使用controller的addListener方法監聽控制器 。 (若是你添加了一個監聽器,記得在你的State對象的dispose方法中刪除監聽器 )。
TextEditingController _controller = TextEditingController();
_controller.addListener(() {
String text = _controller.text;
int length = text.length;
print('text: ${text} length:${length}');
if (length >= 5) {
_controller.clear();
}
});
I/flutter (23802): text: 蘇 length:1
I/flutter (23802): text: 蘇武難飛 length:4
I/flutter (23802): text: 蘇武難飛帥 length:5
I/flutter (23802): text: length:0
複製代碼
本篇內容到這裏就結束了,雖然我再也不作Android
開發,可是我卻依然喜好懷念作開發的日子。給本身定個小目標,但願下半年能夠在掘金社區有50個贊吧😂