Flutter 使用 MVC 架構分離 UI 與邏輯
雖然 Flutter 是以 Dart 寫 UI 與 邏輯
,但我們依然可使用 MVC 架構將 UI 與 邏輯
分離,方便日後維護。
失くすものさえない今が強くなるチャンスよ
雖然 Flutter 是以 Dart 寫 UI 與 邏輯
,但我們依然可使用 MVC 架構將 UI 與 邏輯
分離,方便日後維護。
Pixel Overflow 是 Flutter 開發中常遇到的問題,透過由 MediaQuery
取得裝置長寬,可動態設定 Margin 避免 Pixel Overflow。
Pixel Overflow 是 Flutter 開發中常遇到的問題,透過由 MediaQuery
取得裝置長寬,可動態設定 Row
的 Gap 避免 Pixel Overflow。
Pixel Overflow 是 Flutter 開發中常遇到的問題,透過由 MediaQuery
取得裝置長寬,可動態設定 Column
的 Gap 避免 Pixel Overflow。
雖然理論上 Material Design 要使用內建的顏色變數,如 primary
、secondary
…,但實務上 Designer 可能並不使用這些變數,我們也可以在 Material Design 使用 Figma 的變數。
要水平使每個 Widget 等距,可使用 Row
的mainAxisAlignment: MainAxisAlignment.spaceBetween
實現。
將兩個 Widget 同時水平向左右兩側對齊是常見需求,可使用 Row
的mainAxisAlignment: MainAxisAlignment.spaceBetween
實現。
Row
可將 Widget 水平排列
。
Flutter 為了加速開發,提供了 Hot Reload、Hot Restart 與 Full Restart 三種模式,各有各的使用時機及場景。
AVD 也可直接從 CLI 啟動,不必從 Android Studio 啟動。
若以 Android Studio 開啟 AVD,由於預設 DNS 是虛擬的,因此無法打 API,必須以 CLI 指定 DNS 啟動 AVD。
Flutter 已經定義了很多預設目錄,但一些常用元素並沒有,團隊可依據需求自行定義之。
ListView
一般都會搭配 ListTile
,但 ListTile
自帶 Padding,且無法清除,最有效的方式是使用沒有自帶 Padding 的 GestureDetector
取代 ListTile
。
DropdownBottomSheet
典型都是使用 ListView
搭配 ListTile
實現,但 ListTile
自帶 Padding,可能會無法達成 Designer
的設計要求,可使用沒有自帶 Padding 的 GestureDector
取代 ListTile
。
ListView
適合顯示清單,且支援卷軸。
IconButton
自帶 Margin,如想以一排 IconButton
實現 ToolBar
時,會發現 IconButton
自帶的 Margin 很不方便,此時可使用 GestureDetector
實現 IconButton
。
Flutter 並沒有提供 DropdownBottomSheet
顯示兩層選單,必須自行使用 ModalBottomSheet
、ListView
與 Padding
實現。
Flutter 並沒有提供 DropdownBottomSheet
顯示下方有捲軸選單,必須自行使用 ModalBottomSheet
、 ListView
與 Scrollbar
實現。
ModalButtonSheet
為手機風格的下拉選單,可自行設計所顯示的 UI。
Flutter 並沒有提供 DropdownBottomSheet
顯示下方彈出選單,必須自行使用 ModalBottomSheet
與 ListView
實現。
NavigationBar
所切換的每個 Page,實務上由於會非常複雜,會將每個 Page 抽出成獨立檔案。
NavigationBar
為智慧手機經典介面,將 Button
放在底部方便使用者快速切換頁面。
DropdownButton
可實現兩層下拉選單。
Scrcpy 可將 Android 手機畫面投影到 macOS 上,特別適合開會分享畫面。
IconButton
可實現只有 Icon 的 Button。
當點擊 TextFormField
時,會自動顯示 Soft Keyboard,但點擊其他地方,卻不會自動關閉 Soft Keyboard,必須自行關閉之。
Flutter 並沒有特別提供 Password
,可透過 TextFormField
實現。
Flutter 的 MaterialApp
支援 Theme,可分別自訂 Light Mode 與 Dark Mode 的顏色。
Flutter 的 MaterialApp
支援 Theme,可透過 ThemeData.light()
與 ThemeData.dark()
簡單支援 Light Mode 與 Dark Mode。
為了避免 User 設定系統字型大小而造成跑版,可透過 MediaQuery
設定。
MediaQuery
可以幫助你取得螢幕的 尺寸
、方向
、縮放比例
等資訊,常用於製作 Responsive Design。
ElavatedButton
亦可設定成背景為 漸層色
,但必須搭配 Container
與 BoxDecoration
才能實現。
ElavatedButton
可顯示突起的 Button。
一般 Toast
是由上方彈出,而 SnakeBar
是由下方彈出。
MaterialApp
可建立 Android 風格頁面。
TextFormField
預設會占滿整個 Column,且本身也沒有提供 Margin 設定,但可透過 Padding
提供 TextFormField
所需的 Margin。
CupertinoApp
可建立 iOS 風格頁面。
當整個頁面到不需要 State 時,可簡單地使用 StatelessWidght
即可。
大多數的頁面到需要 State,如經典的 Counter,可簡單地使用 StatefulWidght
實現。
TextFormField
可實現進階輸入框,搭配 TextEditingController
可支援 Two Way Binding。