Flutter 完美的驗證碼輸入框?qū)崿F(xiàn)
老孟導讀:剛開始看到這個功能的時候一定覺得so easy,開始的時候我也是這么覺得的,這還不簡單,然而真正寫的時候才發(fā)現(xiàn)并沒有想象的那么簡單。
先上圖,不上圖你們都不想看,我難啊,到Github:https://github.com/781238222/flutter-do 上給個小星星可還行,如果能fork一下,那更是感激不盡。


言歸正傳,完成驗證碼輸入框經(jīng)歷了4個階段,雖然前3個嘗試是失敗的,但也想和大家分享下,避免大家再走彎路。
第一階段:開始的時候,我認為直接修改TextField控件,改改外觀就可以了,所以我就直接去改TextField的屬性,研究了一遍,發(fā)現(xiàn)無法達到要求,系統(tǒng)提供的屬性無法達到我的要求。
第二階段:既然原生的TextField無法實現(xiàn)我的效果,那就重寫一個(并不是全部重寫,而是把源代碼copy出來,修改控制外觀的代碼),于是我就去copy源代碼了,可真正copy的時候發(fā)現(xiàn)TextField的關(guān)系比較復(fù)雜,并不是一個簡單的StatefulWidget控件,而且需要計算字符的寬度,此方案雖然能實現(xiàn),但想想就復(fù)雜,果斷拋棄。
第三階段:用6個TextField,每一個控制一個驗證碼,雖然樣式及布局上很容易達到要求,但焦點控制問題非常致命,此方案也pass。
第四階段:經(jīng)過上面失敗的經(jīng)歷,最后我才用如下方案:一個TextField用于輸入,而驗證碼的顯示使用Container,驗證碼覆蓋在TextField之上,用戶無法感知到TextField,這是目前為止我發(fā)現(xiàn)的最完美的方案。
焦點問題
正常情況下,出現(xiàn)驗證碼的頁面會彈出鍵盤,此效果很好實現(xiàn),指需給TextField指定自動獲取焦點即可,代碼如下:
TextField( autofocus:true, ... )
如果頁面還有其他輸入框,那么就不一定要獲取焦點了,因此是否獲取焦點需要交給用戶來決定。
如果開始沒有獲取焦點就出現(xiàn)了一個問題,用戶點擊“驗證碼”的時候需要獲取焦點,獲取焦點方法如下:
GestureDetector(
onTap: () {
FocusScope.of(context).requestFocus(_focusNode);
},
...
)
給整個控件的外層添加點擊事件,_focusNode為TextField的focusNode。
輸入完成后,通常需要關(guān)閉鍵盤,即TextField失去焦點,失去焦點方法如下:
_focusNode.unfocus();
使用
使用非常簡單,如下:
Container( height: 45, child: VerificationBox(), )
效果如下:

設(shè)置驗證碼的數(shù)量,比如設(shè)置4個:
VerificationBox( count: 4, )
效果如下:

設(shè)置樣式,包括邊框的顏色、寬度、圓角:
VerificationBox( borderColor: Colors.lightBlue, borderWidth: 3, borderRadius: 50, )
效果如下:

除了“盒子”樣式,還支持下劃線樣式:
VerificationBox( type: VerificationBoxItemType.underline, )
效果如下:

設(shè)置數(shù)字的樣式:
VerificationBox( textStyle: TextStyle(color: Colors.lightBlue), )
效果如下:

顯示光標,設(shè)置光標樣式:
VerificationBox( showCursor: true, cursorWidth: 2, cursorColor: Colors.red, cursorIndent: 10, cursorEndIndent: 10, )
效果如下:

還可以設(shè)置光標為整個邊框,如下:
VerificationBox( focusBorderColor: Colors.lightBlue, )
效果如下:

終極大招,如果你覺得這個效果不好,你可以自定義decoration:
VerificationBox(
decoration: BoxDecoration(
image: DecorationImage(image: AssetImage('images/box.png')),
),
textStyle: TextStyle(color: Colors.lightBlue),
),
)
效果如下:

驗證碼輸入完成后回調(diào)onSubmitted,用法如下:
VerificationBox(
onSubmitted: (value){
print('$value');
},
)
輸入完成后,默認鍵盤消失,設(shè)置為不消失,代碼如下:
VerificationBox( unfocus: false, )
到此這篇關(guān)于Flutter 完美的驗證碼輸入框?qū)崿F(xiàn)的文章就介紹到這了,更多相關(guān)Flutter 驗證碼輸入框內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android App中使用Pull解析XML格式數(shù)據(jù)的使用示例
這篇文章主要介紹了Android App中使用Pull解析XML格式數(shù)據(jù)的使用示例,Pull是Android中自帶的XML解析器,Java里也是一樣用:D需要的朋友可以參考下2016-04-04
Android從源碼的角度徹底理解事件分發(fā)機制的解析(上)
這篇文章主要介紹了Android從源碼的角度徹底理解事件分發(fā)機制的解析,具有很好的參考價值,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05
Android App中讀取XML與JSON格式數(shù)據(jù)的基本方法示例
這篇文章主要介紹了Android App中讀取XML與JSON格式數(shù)據(jù)的基本方法示例,Android中自帶的JSONObject非常好用,需要的朋友可以參考下2016-03-03
Flutter UI如何使用Provide實現(xiàn)主題切換詳解
這篇文章主要給大家介紹了關(guān)于Flutter UI如何使用Provide實現(xiàn)主題切換的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Flutter具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-04-04
Android編程實現(xiàn)圖片背景漸變切換與圖層疊加效果
這篇文章主要介紹了Android編程實現(xiàn)圖片背景漸變切換與圖層疊加效果,涉及Android圖形特效的相關(guān)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下2017-01-01

