每日筆記

前言

今天有以下主題:

  1. Flutter Practice
  2. Flutter Learning Note

Flutter Practice

將 Flutter 官方的 Cookbook 中的 Form Part 看完後,決定根據先前的經驗還有 Form part 中的教學來實作一個 Register Form。

在開始 Coding 前,少不了草稿上的預先設計!

一個簡易的表單就出來了!
在這個表單中,包括:

  1. Email 輸入欄位:
    這個欄位需要驗證輸入資料是否符合 Email 的格式。
  2. Username 輸入欄位:
    這個欄位需要確定輸入資料的長度小於 20 個 character。
  3. Password 輸入欄位:
    這個欄位需要驗證密碼是否包含 1 個大寫字母,1 個特殊符號,以及密碼長度大於 6 個 character。
  4. 每個欄位都需要 Focus 的能力,在輸入資料有誤時,Focus 在該欄位上。

除了功能性外,盡量使用了一個 TextFormField 能夠使用到的外觀設計。
包括:

  1. icon
  2. border
  3. labelText
  4. counterText

底下是成果!

撇除圖中 error text 僅呼叫使用者填寫資料,程式確實能夠完成上述提及的需求,有興趣體驗了解的人,可以前往我的
GitHub – real_world_practice_1 資料夾 下載程式碼實際執行試試!若有其他疑慮或建議,歡迎底下留言區留言!

並未盡善盡美

在實踐這個表單的最後,是加入 Focus 的能力。
在這次實踐中,Focus 會根據最下層沒有填寫的資料一路往上 Focus。舉例來說,如果 password 欄位和 username 欄位都沒有填寫,程式會先 focus 在 password 欄位。
如何控制 focus 的順序,我花了將近兩個小時研究,仍然沒有得出想要的結果(從最上層開始往下 focus)。
我試過 FocusTraversalGroup 搭配 OrderedTraversalPolicy 還有 FocusTraversalOrder 與 NumericFocusOrder,仍然無法達到想要的目標。目前有兩種可能:

  1. 我對於 Focus System 的運作方式還不夠瞭解
  2. Flutter 有 Bug

在此紀錄未來需要專研的 Subject:Focus Management

除了 Focus 的部分,對於外觀的設計我也還有待加強。

兩者都屬較進階的議題,待完成 Flutter Roadmap 中的 Beginner Part 之後,將繼續專研!

Flutter Learning Note

在實作中,還是會遇到一些先前沒有特別注意,或者新學到的理論知識或技術:

  1. 上次提及的 const 效能增加,有更具體的觀念。
    在設計表單的過程,會遇到有些地方會發生變動,例如 counterText 若想隨著輸入欄位內的字數改動而變動,InputDecoration() 就不能宣告為 const,然而 InputDecoration() 底下的 OutlineInputBorder() 是不會變動的,它就需要宣告為 const 增加效能。
    (原本 const 宣告在 InputDecoration() 上,不需要額外在 OutlineInputBorder() 上宣告 const,也就是說,一但同級屬性需要變動,其他不會變動的部分就要宣告 const。總結:為了效能而宣告的 const 會因為變動需求而往下傳遞。)
  2. 為了 Focus,還不小心摸索到 Keyboard Focus System 去,這是另一個進階議題。
  3. Container vs SizedBox
    這兩個的差異在哪呢?
    SizedBox 單純用於指定「固定大小的框」,因此效能會比 Container 高。
    Container 可以提供佈局、對其、填充、背景顏色等功能,還可根據需求自動調整大小(手動也可以),能做的事比 SizedBox 多,因此純效能上比 SizedBox 差。
    若單純想調整、排列 Widget 大小和間隙,使用 SizedBox 比較好。
    若有其他外觀上的需求,可以使用 Container 完成。
  4. 在設計表單時,有發生直屏可以完整顯示,但橫屏會 overflow 的問題。我使用的解決辦法是讓表單可以活動,而 container 則會根據螢幕而變動。
    讓表單滑動的方式是透過 SingleChildScrollView()。
    有兩個點可以進步:
    1. 這次因為只有單一個表單,所以可以使用 SingleChildScrollView(),還可以想想是否有其他做法。
    2. container 根據螢幕變動的方法,還不是非常清楚如何設計與做到。

今天的影片分享

影片主題:學習 Flutter Form 該知道些什麼?

Leave a Comment

Your email address will not be published. Required fields are marked *