天天看點

【Flutter 1-20】Flutter手把手教程UI布局和Widget——TextField使用、搭配InputDecoration和FocusedNode

TextField是一個常用的控件,同時它也是一個組合控件,由多個控件組合而成。

這是來自Material官方網站的的圖檔

【Flutter 1-20】Flutter手把手教程UI布局和Widget——TextField使用、搭配InputDecoration和FocusedNode

TextField是由7個控件組成,其中有些控件預設不顯示,我們可以對各個控件單獨設定想要的樣式來滿足不同的UI展示需求。

下面我們就來列舉幾種常見的樣式:

1. 簡單的TextField

TextField接收一個InputDecoration作為參數,InputDecoration初始化的參數labelText可以幫助我們定義placeholder。labelText模式會灰色的,選中之後會變為藍色,并且TextField底部會有一條藍色線條。

【Flutter 1-20】Flutter手把手教程UI布局和Widget——TextField使用、搭配InputDecoration和FocusedNode

2. 限制字元的長度

maxLength可以設定最長字元個數,如果超過這個限制再次輸入不會有顯示,并且在TextField在有右下角有目前字元個數的标記,此處是10/10。

【Flutter 1-20】Flutter手把手教程UI布局和Widget——TextField使用、搭配InputDecoration和FocusedNode

3. 限制行數

maxLines參數可以設定行數,比如這裡設定的是2,預設隻會顯示兩行,超過兩行的部分隻能通過上下滾動來顯示。

【Flutter 1-20】Flutter手把手教程UI布局和Widget——TextField使用、搭配InputDecoration和FocusedNode
預設行數是1,超過的部分會往左縮進。

4. labelText設定顔色

InputDecoration可以設定labelStyle參數,接收一個TextStyle對象,TextStyle這個我們比較熟悉,在之前講解Text的文章中已經做了很多詳解了。設定顔色之後,當點選TextField之後,文字會變小,顔色也是設定好的顔色。

【Flutter 1-20】Flutter手把手教程UI布局和Widget——TextField使用、搭配InputDecoration和FocusedNode

5. 左側Icon

icon參數可以傳入一個Icon對象用來顯示在TextField的左側,我們可以傳入各式各樣的Icon,滿足我們更豐富的展示需求。

【Flutter 1-20】Flutter手把手教程UI布局和Widget——TextField使用、搭配InputDecoration和FocusedNode

6. 右側Icon suffix和suffixIcon

suffixIcon預設是顯示在右側的,TextField被點選之後會顯示為被選中狀态,suffix預設不顯示,隻有當選中TextField的時候才會顯示出來。

【Flutter 1-20】Flutter手把手教程UI布局和Widget——TextField使用、搭配InputDecoration和FocusedNode

7. 輔助提示

helperText可以幫助我們在TextField下面顯示一行提示文字,同樣我們也可以使用helperStyle來設定這段提示文字的樣式。

【Flutter 1-20】Flutter手把手教程UI布局和Widget——TextField使用、搭配InputDecoration和FocusedNode

8. 點選後的提示 hintText

hintText參數可以幫助我們設定一個點選後顯示的文字,隻有點選之後才可以顯示,同樣我們可以通過hintStyle來設定hintText的樣式。

【Flutter 1-20】Flutter手把手教程UI布局和Widget——TextField使用、搭配InputDecoration和FocusedNode

9. 不顯示下劃線

focusedBorder可以幫助我們設定下劃線的樣式,如果傳入InputBorder.none則不會顯示下劃線。

【Flutter 1-20】Flutter手把手教程UI布局和Widget——TextField使用、搭配InputDecoration和FocusedNode

10. 自定義下劃線樣式

我們可以給focusedBorder傳入自定義的UnderlineInputBorder來自定義下劃線的樣式,這裡我們簡單做了個顔色的改變。

【Flutter 1-20】Flutter手把手教程UI布局和Widget——TextField使用、搭配InputDecoration和FocusedNode

日常開發中,我們往往希望在三個地方TextField可以給我們回調。

輸入文字的過程中,這樣友善我們在使用者輸入的時候就可以判斷輸入内容是否合法。

輸入完成的時候,這個時候我們可以拿到輸入内容做一些操作。

與鍵盤事件的配合,在必要的時候回收鍵盤。

TextField提供了三個回調方法

onChanged 此方法是在輸入有變化的時候就會回調。參數是目前已經輸入的内容

onSubmitted 此方法是在我們輸入完成後,點選鍵盤上回車的時候回調。參數是目前的已經輸入的内容

onEditingComplete此方法也是在點選鍵盤上回車的時候回調,它會在onSubmitted之前執行。不會帶有參數

需要注意是onEditingComplete回調方法沒有攜帶參數。如果我們需要在onEditingComplete方法中擷取到目前的輸入值。

那就需要通過TextEditingController來捕捉輸入内容,TextField接收一個TextEditingController對象來作為controller參數,

通過TextEditingController的屬性text我們也可以擷取到目前的輸入内容。

11. 事件回調

可以看到通過controller.text可以擷取到目前的輸入内容。12. 鍵盤回收

FocusNode可以幫助我們進行鍵盤的回收,我隻需要将FocusScope的requestFocus方法中傳入一個新的FocusNode對象即刻。

如果在開發過程中,我們希望通過點選頁面上某個按鈕來結束TextField輸入并且擷取到目前的輸入内容。使用FocusNode是很有效的。

【Flutter 1-20】Flutter手把手教程UI布局和Widget——TextField使用、搭配InputDecoration和FocusedNode

想體驗以上的示例的運作效果,可以到我的Github倉庫項目flutter_app->lib->routes->textfield_page.dart檢視,并且可以下載下傳下來運作并體驗。