- 原文地址:Answering Questions on Flutter App Development
- 原文做者:Deven Joshi
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:YueYong
- 校對者:zx-Zhu
經過個人講座和研討會在與不少學生和開發人員親自交流後,我意識到他們中不少人都對 Flutter 和應用程序開發有共同的問題,甚至還有誤解。所以我決定去寫一篇文章來解釋這些廣泛的疑惑。注意,這篇文章旨在解釋一些問題,而不是對每一個方面的詳細表述。爲簡潔起見,我可能沒有涉及到一些例外狀況。請注意,Flutter 自己也有一個針對各類背景下的常問問題頁面 flutter.io,在這裏我將更多地關注我常常看到的問題。雖然其中一些也包含在 Flutter 常見問題解答中,可是我仍是嘗試着去給出個人觀點。前端
在 Android 框架中,咱們將 Activity 分爲佈局和代碼。所以,咱們須要引用視圖以在 Java 中使用它們。(固然 Kotlin 能夠避免這種狀況。)佈局文件自己用 XML 編寫,包含 Views 和 ViewGroups。android
Flutter 使用一種全新的方法,而不是視圖,使用 Widget。在 Android 中,View 就是佈局的一個組件,但在 Flutter 中,Widget 幾乎就是一切。從按鈕到佈局結構,全部的這些都是一個 Widget。他在這裏的優點是可定製性。想象一下 Android 中的一個按鈕。它具備文本等屬性,可以讓你向按鈕添加文本。但 Flutter 中的按鈕不會將標題做爲字符串,而是另外一個 widget。這意味着,在按鈕內部,您能夠擁有文本,圖像,圖標以及您能夠想象的任何內容,而且不會破壞佈局約束。這也讓你能夠很容易地製做自定義 Widget,而在 Android 中製做自定義 view 是一件至關困難的事情。ios
在某些方面,這是事實。但 Flutter 社區中的不少人都更喜歡代碼方式,但這並不意味着拖放沒法實現。若是你徹底喜歡拖放,那麼 Flutter Studio 是我推薦的一個很棒的資源,它能夠經過拖放幫助你生成佈局。這是一個讓我印象深入的工具,很想知道它未來會如何發展。git
連接: flutterstudio.appgithub
簡單地回答這個問題:爲 WebView 編寫的代碼或相似運行的應用程序必須通過多個層才能最終執行。從本質上講,Flutter 經過編譯到原生 ARM 代碼來實現這兩個平臺上的執行。「混合」應用程序緩慢,緩慢,與它們運行的平臺看起來不一樣。Flutter 應用程序的運行速度遠遠超過混合應用程序。此外,使用插件訪問本機組件和傳感器要比使用沒法充分利用其平臺的 WebView 更容易。編程
Flutter項目中有三個主要文件夾:lib、android 和 ios 。'lib' 負責處理你的 Dart 文件。Android 和 iOS 文件夾用於在各自的平臺上實際構建應用程序,並在其上運行 Dart 文件。它們還能夠幫助您爲項目添加權限和特定於平臺的功能。當您運行 Flutter 項目時,它會根據運行的模擬器或設備進行構建,使用其中的文件夾執行 Gradle 或 XCode 構建。簡而言之,這些文件夾爲 Flutter 代碼的運行成爲一個完整的 APP 奠基了基礎。後端
若是你運行 Flutter 應用程序,你知道它很快。很是快。它是如何作到的?在構建應用程序時,它實際上用到了全部資源文件,而不是僅使用特定的資源文件。爲何這有幫助?由於若是我將圖標從一個更改成另外一個,則沒必要徹底重建應用程序。這就是 Flutter 調試版本如此之大的緣由。建立發佈版本時,只會獲取所需的資源文件,而且咱們會得到更多習慣的大小。Flutter 應用程序仍然比 Android 應用程序略大,但它至關小,加上 Flutter 團隊一直在尋找減小應用程序大小的方法。瀏覽器
這有兩部分答案。bash
個人我的意見是學習 Android / iOS 一兩個月,而後再開始學習 Flutter。架構
Packages 容許您將新的工具或功能導入你的應用程序。Packages 和 plugins 之間有一點區別。Packages 一般是新的組件或純粹在 Dart 中編寫的代碼,而 plugins 容許更多功能在設備上使用原生代碼。一般在 DartPub 上,Packages 和 plugins 都被稱爲包,而且只有在建立新包時才明確提到區別。
Pubspec.yaml 容許你定義應用依賴的包,聲明你的資源文件,如圖片,音頻,視頻等。它還容許你爲你的應用設置約束。對於 Android 開發人員來講,這大體相似於 build.gradle 文件,但二者之間的差別也很明顯。
首次構建 Flutter 應用程序時,會構建特定於設備的 APK 或 IPA文件。由於要用到 Gradle 和 XCode 用於構建文件,須要時間。下次從新啓動或熱從新加載應用程序時,Flutter 實際上會在現有應用程序之上修補更改,從而實現快速刷新。
**注意:**熱重載或重啓所作的更改不會設備 APK 或 IPA 文件中保存。要確保你的應用在設備上完成全部更改,請考慮中止並從新運行該應用。
簡單來講,「State」 是 widget 變量值的集合。 任何像計數器,文本等同樣能夠改變的東西均可以成爲 State 的一部分。想象一個櫃檯應用程序,主要的動態是計數器計數。計數更改時,須要刷新屏幕以顯示新值。 setState() 本質上是一種告訴應用程序使用新值刷新和重建屏幕的方法。
太長了,簡單的說:容許你刷新屏幕的 Widget是一個有狀態小部件。反之則是無狀態的。
詳細地說,具備能夠更改的內容的動態窗口小部件應該是有狀態的 Widget。無狀態 Widget 只能在參數更改時更改內容,所以須要在窗口小部件層次結構中的位置點之上完成。包含靜態內容的屏幕或窗口小部件應該是無狀態窗口小部件,但要更改內容,須要是有狀態的。
Android Studio 提供了一些工具,能夠更輕鬆地構建 Flutter 代碼。兩個主要的方法是:
咱們將一個函數傳遞給一個小部件,主要是說「當事情發生時調用這個函數」。函數是 Dart 中的第一類對象,能夠做爲參數傳遞給其餘函數。使用 Android(<Java 8) 等接口的回調有太多的樣板代碼用於簡單的回調。
Java 回調:
button.setOnClickListener(new View.OnClickListener() {
@override
public void onClick(View view) {
// Do something here
}
}
);
複製代碼
(請注意,這只是用於設置偵聽器的代碼。定義按鈕須要單獨的 XML 代碼。)
Dart equivalent:
FlatButton(
onPressed: () {
// Do something here
}
)
複製代碼
(Dart同時進行聲明以及設置回調。)
這變得更加整潔,並幫助咱們避免沒必要要的複雜化。
ScopedModel 和 BLoC(業務邏輯組件)是常見的 Flutter 應用程序架構模式,可幫助將業務邏輯與 UI 代碼分離,並使用更少的有狀態 widget。 有更好的資源來學習這些,我不認爲有理由在幾行中解釋它們。
我但願這篇文章可以消除一些疑問,而且我將盡力更新我遇到的常見問題。若是你喜歡這篇文章,請給我一些鼓勵,若是你但願我添加其餘問題,請務必發表評論。
若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。