本文檔適用那些但願將現有 iOS 經驗應用於 Flutter 的開發者。若是你擁有 iOS 開發基礎,那麼你可使用這篇文檔開始學習 Flutter 的開發。javascript
開發 Flutter 時,你的 iOS 經驗和技能將會大有裨益,由於 Flutter 依賴於移動操做系統的衆多功能和配置。Flutter 是用於爲移動設備構建用戶界面的全新方式,但它也有一個插件系統用於和 iOS(及 Android)進行非 UI 任務的通訊。若是你是 iOS 開發專家,則你沒必要將 Flutter 完全從新學習一遍。html
你能夠將此文檔做爲 cookbook,經過跳轉並查找與你的需求最相關的問題。java
在 iOS 中,構建 UI 的過程當中將大量使用 view 對象。這些對象都是 UIView
的實例。它們能夠用做容器來承載其餘的 UIView,最終構成你的界面佈局。ios
在 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 在內的全部系統進行了優化。json
可是用 Flutter 實現任何的設計語言都很是的靈活和富有表現力。在 iOS 平臺,你可使用 Cupertino widgets 來構建遵循了 Apple’s iOS design language 的界面。canvas
在 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.