Flutter for iOS 開發者 本文檔適用那些希望將現有 iOS 經驗應用於 Flutter 的開發者。如果你擁有 iOS 開發基礎,那麼你可以使用這篇文檔開始學習 Flutter 的開發。 開發 Flutter 時,你的 iOS 經驗和技能將會大有裨益,因為 Flutter 依賴於移動操作 ...
Flutter for iOS 開發者
本文檔適用那些希望將現有 iOS 經驗應用於 Flutter 的開發者。如果你擁有 iOS 開發基礎,那麼你可以使用這篇文檔開始學習 Flutter 的開發。
開發 Flutter 時,你的 iOS 經驗和技能將會大有裨益,因為 Flutter 依賴於移動操作系統的眾多功能和配置。Flutter 是用於為移動設備構建用戶界面的全新方式,但它也有一個插件系統用於和 iOS(及 Android)進行非 UI 任務的通信。如果你是 iOS 開發專家,則你不必將 Flutter 徹底重新學習一遍。
你可以將此文檔作為 cookbook,通過跳轉並查找與你的需求最相關的問題。
Views
UIView 相當於 Flutter 中的什麼?
在 iOS 中,構建 UI 的過程中將大量使用 view 對象。這些對象都是 UIView
的實例。它們可以用作容器來承載其他的 UIView,最終構成你的界面佈局。
在 Flutter 中,你可以粗略地認為 Widget
相當於 UIView
。Widget 和 iOS 中的控制項並不完全等價,但當你試圖去理解 Flutter 是如何工作的時候,你可以認為它們是“聲明和構建 UI 的方法”。
然而,Widget 和 UIView 還是有些區別的。首先,widgets 擁有不同的生存時間:它們一直存在且保持不變,直到當它們需要被改變。當 widgets 和它們的狀態被改變時,Flutter 會構建一顆新的 widgets 樹。作為對比,iOS 中的 views 在改變時並不會被重新創建。但是與其說 views 是可變的實例,不如說它們被繪製了一次,並且直到使用 setNeedsDisplay()
之後才會被重新繪製。
此外,不像 UIView,由於不可變性,Flutter 的 widgets 非常輕量。這是因為它們本身並不是什麼控制項,也不會被直接繪製出什麼,而只是 UI 的描述。
Flutter 包含了 Material 組件庫。這些 widgets 遵循了 Material 設計規範。MD 是一個靈活的設計系統,並且為包括 iOS 在內的所有系統進行了優化。
但是用 Flutter 實現任何的設計語言都非常的靈活和富有表現力。在 iOS 平臺,你可以使用 Cupertino widgets 來構建遵循了 Apple’s iOS design language 的界面。
我怎麼來更新 Widgets?
在 iOS 上更新 views,只需要直接改變它們就可以了。在 Flutter 中,widgets 是不可變的,而且不能被直接更新。你需要去操縱 widget 的 state。
這也正是有狀態的和無狀態的 widget 這一概念的來源。一個 StatelessWidget
正如它聽起來一樣,是一個沒有附加狀態的 widget。
StatelessWidget
在你構建初始化後不再進行改變的界面時非常有用。
舉個例子,你可能會用一個 UIImageView
來展示你的 logo image
。如果這個 logo 在運行時不會改變,那麼你就可以在 Flutter 中使用 StatelessWidget
。
如果你希望在發起 HTTP 請求時,依托接收到的數據動態的改變 UI,請使用 StatefulWidget
。當 HTTP 請求結束後,通知 Flutter 框架 widget 的 State
更新了,好讓系統來更新 UI。
有狀態和無狀態的 widget 之間一個非常重要的區別是,StatefulWidget
擁有一個 State
對象來存儲它的狀態數據,併在 widget 樹重建時攜帶著它,因此狀態不會丟失。
如果你有疑惑,請記住以下規則:如果一個 widget 在它的 build
方法之外改變(例如,在運行時由於用戶的操作而改變),它就是有狀態的。如果一個 widget 在一次 build 之後永遠不變,那它就是無狀態的。但是,即便一個 widget 是有狀態的,包含它的父親 widget 也可以是無狀態的,只要父 widget 本身不響應這些變化。
下麵的例子展示瞭如何使用一個 StatelessWidget
。一個常見的 StatelessWidget
是 Text
widget。如果你查看 Text 的實現,你會發現它是 StatelessWidget 的子類。
Text(
'I like Flutter!',
style: TextStyle(fontWeight: FontWeight.bold),
);
閱讀上面的代碼,你可能會註意到 Text
widget 並不顯示地攜帶任何狀態。它通過傳入給它的構造器的數據來渲染,除此之外再無其他。
但是,如果你希望 I like Flutter
在點擊 FloatingActionButton
時動態的改變呢?
為了實現這個,用 StatefulWidget
包裹 Text
widget,併在用戶點擊按鈕時更新它。
舉個例子:
class SampleApp extends StatelessWidget {
// This widget is the root of your application.