Flutter TextField

版權(quán)聲明:本文為博主原創(chuàng)文章乙墙,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明掌实。
本文鏈接:https://blog.csdn.net/yechaoa/article/details/90906689
文章目錄
基本屬性
TextField
InputDecoration
樣式
基礎樣式
隱藏文本
鍵盤類型
鍵盤按鈕
大小寫
光標
最多行數(shù)
計數(shù)器
圖標
提示文字
去除下劃線
邊框
獲取輸入內(nèi)容
關(guān)閉軟鍵盤
校驗
異常
總結(jié)
github:https://github.com/yechaoa/wanandroid_flutter/blob/master/lib/pages/loginPage.dart
效果:

終于還是對TextField下手了陪蜻,這個屬性最多、功能點最多的Widget贱鼻。

基本屬性
TextField是一個material design風格的輸入框宴卖,本身有多種屬性,除此之外裝飾器InputDecoration也有多種屬性邻悬,但都比較簡單症昏,所以不必擔心,且聽我娓娓道來父丰。

先看一下源碼肝谭,重要或常用的屬性會有注釋。

TextField
const TextField({
Key key,
this.controller,//控制器
this.focusNode,//焦點
this.decoration = const InputDecoration(),//裝飾
TextInputType keyboardType,//鍵盤類型蛾扇,即輸入類型
this.textInputAction,//鍵盤按鈕
this.textCapitalization = TextCapitalization.none,//大小寫
this.style,//樣式
this.strutStyle,
this.textAlign = TextAlign.start,//對齊方式
this.textDirection,
this.autofocus = false,//自動聚焦
this.obscureText = false,//是否隱藏文本攘烛,即顯示密碼類型
this.autocorrect = true,//自動更正
this.maxLines = 1,//最多行數(shù),高度與行數(shù)同步
this.minLines,//最小行數(shù)
this.expands = false,
this.maxLength,//最多輸入數(shù)屁桑,有值后右下角就會有一個計數(shù)器
this.maxLengthEnforced = true,
this.onChanged,//輸入改變回調(diào)
this.onEditingComplete,//輸入完成時医寿,配合TextInputAction.done使用
this.onSubmitted,//提交時,配合TextInputAction
this.inputFormatters,//輸入校驗
this.enabled,//是否可用
this.cursorWidth = 2.0,//光標寬度
this.cursorRadius,//光標圓角
this.cursorColor,//光標顏色
this.keyboardAppearance,
this.scrollPadding = const EdgeInsets.all(20.0),
this.dragStartBehavior = DragStartBehavior.start,
this.enableInteractiveSelection,
this.onTap,//點擊事件
this.buildCounter,
this.scrollPhysics,
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
參數(shù)很多,其實日常開發(fā)中連一半的屬性都用不到蘑斧,但還是會盡量多的介紹。

InputDecoration
const InputDecoration({
this.icon,//左側(cè)外的圖標
this.labelText,//懸浮提示,可代替hintText
this.labelStyle,//懸浮提示文字的樣式
this.helperText,//幫助文字
this.helperStyle,
this.hintText,//輸入提示
this.hintStyle,
this.hintMaxLines,
this.errorText,//錯誤提示
this.errorStyle,
this.errorMaxLines,
this.hasFloatingPlaceholder = true,//是否顯示懸浮提示文字
this.isDense,
this.contentPadding,//內(nèi)填充
this.prefixIcon,//左側(cè)內(nèi)的圖標
this.prefix,
this.prefixText,//左側(cè)內(nèi)的文字
this.prefixStyle,
this.suffixIcon,//右側(cè)內(nèi)圖標
this.suffix,
this.suffixText,
this.suffixStyle,
this.counter,//自定義計數(shù)器
this.counterText,//計數(shù)文字
this.counterStyle,//計數(shù)樣式
this.filled,//是否填充
this.fillColor,//填充顏色
this.errorBorder,
this.focusedBorder,
this.focusedErrorBorder,
this.disabledBorder,
this.enabledBorder,
this.border,//邊框
this.enabled = true,
this.semanticCounterText,
this.alignLabelWithHint,
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
參數(shù)很多竖瘾,多為一個小功能點的圖標沟突、文字和樣式,并不復雜捕传。

ok惠拭,基本屬性大概過一遍,腦子里有個印象就行了庸论。下面開始實操职辅。

樣式
基礎樣式
TextField(),
1
很簡單,無任何參數(shù)聂示,當然效果也很簡單域携。

style可以修改樣式。

隱藏文本
修改obscureText屬性值

          TextField(
            obscureText: true,
          ),

1
2
3

可以看到輸入的內(nèi)容已經(jīng)不可見了鱼喉,變成常見的密碼類型了秀鞭。

鍵盤類型
鍵盤類型 即 可輸入的類型,比如number就只能輸入數(shù)字

          TextField(
            keyboardType: TextInputType.number,
          ),

1
2
3

TextInputType可選類型:

text
multiline
number
phone
datetime
emailAddress
url
鍵盤按鈕
即鍵盤右下角的按鈕扛禽,常見的比如完成锋边,右下角是一個完成的對號按鈕,上圖即是编曼。

          TextField(
            textInputAction: TextInputAction.done,
          ),

1
2
3
TextInputAction其他選項:

none
unspecified
done
go
search
send
next
previous
continueAction
join
route
emergencyCall
newline
大小寫
即控制輸入的英文字母大小寫豆巨,比如單詞首字母大寫

          TextField(
            textCapitalization: TextCapitalization.words,
          ),

1
2
3

TextCapitalization的其他選項:

words:單詞首字母大寫
sentences:句子的首字母大寫
characters:所有字母大寫
none:默認無
光標
默認是一個藍色的豎線

          TextField(
            cursorColor: Colors.orange,
            cursorWidth: 15,
            cursorRadius: Radius.circular(15),
          ),

1
2
3
4
5

最多行數(shù)
設置最多3行

          TextField(
            maxLines: 3,
          ),

1
2
3

從效果可以看出,TextField高度已經(jīng)變成了3行掐场。但是我只是想最多輸入3行往扔,默認還是1行的高度怎么辦呢?
不用慌刻肄,加一個參數(shù)就行了: minLines

          TextField(
            maxLines: 3,
            minLines: 1,
          ),

1
2
3
4

可以看到瓤球,TextField的高度是會自適應的。

計數(shù)器
即右下角會有一個計數(shù)

          TextField(
            maxLength: 8,
          ),

1
2
3

默認:當前輸入長度/最大長度敏弃,那這個地方我們能不能改呢卦羡,當然可以,下面簡單操作一下

          TextField(
            maxLength: 8,
            decoration: InputDecoration(
              counter: Text("自定義計數(shù) 0/100"),
            ),
          ),

1
2
3
4
5
6

這里我用到了裝飾InputDecoration下的counter麦到,類型是widget绿饵,那擴展度就相當高了,我只用了一個Text瓶颠,別的widget也是可以的拟赊。

如果只是純文字的話,InputDecoration下還有一個counterText屬性和counterStyle粹淋。

圖標
圖標有3種:

左側(cè)外的圖標
TextField(
decoration: InputDecoration(
icon: Icon(Icons.person),
),
),
1
2
3
4
5

左側(cè)內(nèi)圖標
TextField(
decoration: InputDecoration(
prefixIcon: Icon(Icons.phone_android),
),
),
1
2
3
4
5

右側(cè)內(nèi)圖標
TextField(
decoration: InputDecoration(
suffixIcon: IconButton(
icon: Icon(Icons.close),
onPressed: () {
controller.clear();
},
),
),
),
1
2
3
4
5
6
7
8
9
10

在右側(cè)圖標加了一個IconButton吸祟,因為帶有點擊事件瑟慈,我們可以在點擊的時候清除TextField中的內(nèi)容。

以上就是圖標的介紹屋匕,其實除了圖標之外葛碧,對應的位置也可以顯示文字或者自定義顯示其他widget
比如出了prefixIcon之外還有其他3個屬性,用法跟上面介紹到的自定義計數(shù)器是一樣的过吻。

this.prefix,
this.prefixText,
this.prefixStyle,

1
2
3
提示文字
提示文字有4種:

輸入提示文字
TextField(
controller: controller,
decoration: InputDecoration(
hintText: '請輸入賬號aaa',
),
),
1
2
3
4
5
6

懸浮提示文字
TextField(
controller: controller,
decoration: InputDecoration(
hintText: '請輸入賬號aaa',
labelText: '請輸入賬號',
),
),
1
2
3
4
5
6
7

可以看到进泼,默認顯示labelText,聚焦之后才顯示hintText纤虽,所以labelText是可以取代hintText的乳绕。

幫助提示文字
TextField(
controller: controller,
decoration: InputDecoration(
helperText: "幫助文字",
helperStyle: TextStyle(color: Colors.blue)
),
),
1
2
3
4
5
6
7

一直顯示在左下方

錯誤提示文字
TextField(
controller: controller,
decoration: InputDecoration(
errorText: "你沒有輸入任何內(nèi)容",
),
),
1
2
3
4
5
6

去除下劃線
TextField(
decoration: InputDecoration.collapsed(hintText: "無下劃線的輸入框"),
),
1
2
3

也可以decoration: null, 差別就是沒有hintText了

邊框
TextField(
decoration: InputDecoration(
border: OutlineInputBorder(),
),
),
1
2
3
4
5

如果這個圓角不喜歡的話,也可以改一下的逼纸,比如:

          TextField(
            decoration: InputDecoration(
              border: OutlineInputBorder(
                borderRadius: BorderRadius.all(Radius.circular(30)),
              ),
            ),
          ),

1
2
3
4
5
6
7

獲取輸入內(nèi)容
有兩種方式:

onChanged
onChanged是輸入內(nèi)容改變時的回調(diào)洋措,返回一個String類型的數(shù)值,可以用一個變量記一下
TextField(
onChanged: (text) {
print("輸入改變時" + text);
},
),
1
2
3
4
5
controller
即控制器樊展,初始化:
var controller;

@override
void initState() {
super.initState();
controller = TextEditingController();
controller.addListener(() {});
}
1
2
3
4
5
6
7
8
配置給TextField

          TextField(
            controller: controller,
          ),

1
2
3
獲取內(nèi)容

controller.text
1
在事件中調(diào)用controller.text即返回輸入內(nèi)容呻纹。

關(guān)閉軟鍵盤
往往我們在事件中提交的時候,是需要關(guān)閉軟鍵盤的

這里我們就用到了focusNode

初始化:

FocusNode userFocusNode = FocusNode();
1
配置:

          TextField(
            focusNode: userFocusNode,
          ),

1
2
3
然后在需要的地方調(diào)用:

userFocusNode.unfocus();
1
校驗
校驗的話其實有個inputFormatters屬性

final List<TextInputFormatter> inputFormatters;
1
繼續(xù)看TextInputFormatter源碼专缠,有3個子類:

BlacklistingTextInputFormatter
WhitelistingTextInputFormatter
LengthLimitingTextInputFormatter
黑名單雷酪、白名單和長度限制,我們隨便找一個看一下源碼是怎么實現(xiàn)校驗的:

往下看會看到這么一段代碼:

static final BlacklistingTextInputFormatter singleLineFormatter
= BlacklistingTextInputFormatter(RegExp(r'\n'));
1
2
關(guān)鍵詞在RegExp涝婉,其實就是我們一般用的正則表達式而已哥力。

這樣的話,我們也可以自定義校驗規(guī)則了墩弯,比如校驗手機號:

String validateMobile(String value) {
String patttern = r'(^[0-9]*$)';
RegExp regExp = new RegExp(patttern);
if (value.length == 0) {
return "手機號為空";
} else if (!regExp.hasMatch(value)) {
return "手機號格式不正確";
}
return null;
}
1
2
3
4
5
6
7
8
9
10
以上只是我們一般的校驗吩跋,表單的話還是建議使用From包裹TextFormField

異常
軟鍵盤彈出之后遮蓋
軟鍵盤彈出之后高度溢出
解決辦法:用滑動組件包裹起來(ListView等),這樣軟鍵盤彈出的時候渔工,輸入框也會自動向上滑锌钮。

總結(jié)
以上就是全部介紹了,然后寫了個登錄注冊的小demo:

github:https://github.com/yechaoa/wanandroid_flutter/blob/master/lib/pages/loginPage.dart
官方文檔:https://api.flutter.dev/flutter/material/TextField-class.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末引矩,一起剝皮案震驚了整個濱河市梁丘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旺韭,老刑警劉巖氛谜,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異区端,居然都是意外死亡值漫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門织盼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杨何,“玉大人酱塔,你說我怎么就攤上這事⊥硗蹋” “怎么了延旧?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵谋国,是天一觀的道長槽地。 經(jīng)常有香客問我,道長芦瘾,這世上最難降的妖魔是什么捌蚊? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮近弟,結(jié)果婚禮上缅糟,老公的妹妹穿的比我還像新娘。我一直安慰自己祷愉,他們只是感情好窗宦,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著二鳄,像睡著了一般赴涵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上订讼,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天髓窜,我揣著相機與錄音,去河邊找鬼欺殿。 笑死寄纵,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的脖苏。 我是一名探鬼主播程拭,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棍潘!你這毒婦竟也來了恃鞋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤蜒谤,失蹤者是張志新(化名)和其女友劉穎山宾,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳍徽,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡资锰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了阶祭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绷杜。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡直秆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鞭盟,到底是詐尸還是另有隱情圾结,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布齿诉,位于F島的核電站筝野,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粤剧。R本人自食惡果不足惜歇竟,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抵恋。 院中可真熱鬧焕议,春花似錦、人聲如沸弧关。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽世囊。三九已至别瞭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茸习,已是汗流浹背畜隶。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留号胚,地道東北人籽慢。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像猫胁,于是被迫代替她去往敵國和親箱亿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 瞎扯 如題,文本輸入.沒啥好扯的. Input TextField 是最常用的文本輸入widget. 默認情況下弃秆,...
    Jlanglang閱讀 1,246評論 0 1
  • 實現(xiàn)TextField說簡單也簡單届惋,說有坑,坑也不小菠赚,下面從易到難介紹一下使用 1.最簡單的就是無參數(shù)調(diào)用構(gòu)造方法...
    Realank閱讀 96,444評論 20 64
  • 一個material design的文本字段脑豹。1、文本字段允許用戶使用硬件鍵盤或屏幕鍵盤輸入文本衡查。 只要用戶更改字...
    _白羊閱讀 8,980評論 0 2
  • TextField 是一個文本輸入組件瘩欺,類似 Web 上的 Input。 TextField 有以下常用屬性: a...
    iwakevin閱讀 25,980評論 1 8
  • 我很喜歡你,可俱饿,那又怎么樣呢歌粥,終究是習慣了孤獨
    L小姐嘚一米陽光閱讀 136評論 0 0