[譯] 回答有關 Flutter App 開發的問題

經過個人講座和研討會在與不少學生和開發人員親自交流後,我意識到他們中不少人都對 Flutter 和應用程序開發有共同的問題,甚至還有誤解。所以我決定去寫一篇文章來解釋這些廣泛的疑惑。注意,這篇文章旨在解釋一些問題,而不是對每一個方面的詳細表述。爲簡潔起見,我可能沒有涉及到一些例外狀況。請注意,Flutter 自己也有一個針對各類背景下的常問問題頁面 flutter.io,在這裏我將更多地關注我常常看到的問題。雖然其中一些也包含在 Flutter 常見問題解答中,可是我仍是嘗試着去給出個人觀點。前端

佈局文件在哪裏?/ 爲何 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

Flutter 是否像瀏覽器同樣工做?/ 它與基於 WebView 的應用程序有何不一樣?

簡單地回答這個問題:爲 WebView 編寫的代碼或相似運行的應用程序必須通過多個層才能最終執行。從本質上講,Flutter 經過編譯到原生 ARM 代碼來實現這兩個平臺上的執行。「混合」應用程序緩慢,緩慢,與它們運行的平臺看起來不一樣。Flutter 應用程序的運行速度遠遠超過混合應用程序。此外,使用插件訪問本機組件和傳感器要比使用沒法充分利用其平臺的 WebView 更容易。編程

爲何 Flutter 項目中有 Android 和 iOS 文件夾?

Flutter項目中有三個主要文件夾:lib、android 和 ios 。'lib' 負責處理你的 Dart 文件。Android 和 iOS 文件夾用於在各自的平臺上實際構建應用程序,並在其上運行 Dart 文件。它們還能夠幫助您爲項目添加權限和特定於平臺的功能。當您運行 Flutter 項目時,它會根據運行的模擬器或設備進行構建,使用其中的文件夾執行 Gradle 或 XCode 構建。簡而言之,這些文件夾爲 Flutter 代碼的運行成爲一個完整的 APP 奠基了基礎。後端

爲何個人 Flutter 這麼大?

若是你運行 Flutter 應用程序,你知道它很快。很是。它是如何作到的?在構建應用程序時,它實際上用到了全部資源文件,而不是僅使用特定的資源文件。爲何這有幫助?由於若是我將圖標從一個更改成另外一個,則沒必要徹底重建應用程序。這就是 Flutter 調試版本如此之大的緣由。建立發佈版本時,只會獲取所需的資源文件,而且咱們會得到更多習慣的大小。Flutter 應用程序仍然比 Android 應用程序略大,但它至關小,加上 Flutter 團隊一直在尋找減小應用程序大小的方法。瀏覽器

若是我是編程新手而且我想從移動開發開始,我應該從 Flutter 開始嗎?

這有兩部分答案。bash

  1. 對於相同的頁面,Flutter 很是適合編碼而且代碼比 Android 或 iOS 應用程序少得多。所以對於大多數應用程序,我認爲不會出現重大問題。
  2. 您須要記住的一件事是 Flutter 還依賴於 Android 和 iOS 項目,你至少須要熟悉那些項目結構。若是您想編寫任何原生代碼,你確定須要在任一平臺或兩個平臺上都有經驗。

個人我的意見是學習 Android / iOS 一兩個月,而後再開始學習 Flutter。架構

Packages 和 plugins 是什麼?

Packages 容許您將新的工具或功能導入你的應用程序。Packages 和 plugins 之間有一點區別。Packages 一般是新的組件或純粹在 Dart 中編寫的代碼,而 plugins 容許更多功能在設備上使用原生代碼。一般在 DartPub 上,Packages 和 plugins 都被稱爲包,而且只有在建立新包時才明確提到區別。

什麼是 pubspec.yaml 文件,它有什麼做用?

Pubspec.yaml 容許你定義應用依賴的包,聲明你的資源文件,如圖片,音頻,視頻等。它還容許你爲你的應用設置約束。對於 Android 開發人員來講,這大體相似於 build.gradle 文件,但二者之間的差別也很明顯。

爲何第一個 Flutter 應用程序構建須要這麼長時間?

首次構建 Flutter 應用程序時,會構建特定於設備的 APK 或 IPA文件。由於要用到 Gradle 和 XCode 用於構建文件,須要時間。下次從新啓動或熱從新加載應用程序時,Flutter 實際上會在現有應用程序之上修補更改,從而實現快速刷新。

**注意:**熱重載或重啓所作的更改不會設備 APK 或 IPA 文件中保存。要確保你的應用在設備上完成全部更改,請考慮中止並從新運行該應用。

State 是什麼意思?什麼是 setState()?

簡單來講,「State」 是 widget 變量值的集合。 任何像計數器,文本等同樣能夠改變的東西均可以成爲 State 的一部分。想象一個櫃檯應用程序,主要的動態是計數器計數。計數更改時,須要刷新屏幕以顯示新值。 setState() 本質上是一種告訴應用程序使用新值刷新和重建屏幕的方法。

什麼是有狀態和無狀態小部件?

太長了,簡單的說:容許你刷新屏幕的 Widget是一個有狀態小部件。反之則是無狀態的。

詳細地說,具備能夠更改的內容的動態窗口小部件應該是有狀態的 Widget。無狀態 Widget 只能在參數更改時更改內容,所以須要在窗口小部件層次結構中的位置點之上完成。包含靜態內容的屏幕或窗口小部件應該是無狀態窗口小部件,但要更改內容,須要是有狀態的。

如何處理 Flutter 代碼中的縮進和結構?

Android Studio 提供了一些工具,能夠更輕鬆地構建 Flutter 代碼。兩個主要的方法是:

  1. Alt + Enter/ Command + Enter:這使你能夠輕鬆地在複雜的層次結構中包裝和刪除窗口小部件以及交換窗口小部件。要使用此功能,只需將光標指向小部件聲明,而後按鍵便可爲您提供一些選項。這種智能的感受有時像天賜之物。
  2. DartFMT:dartfmt 格式化您的代碼以保持乾淨的層次結構和縮進。在你不當心移動幾個括號後,它使您的代碼更漂亮。

爲何咱們將函數傳遞給小部件?

咱們將一個函數傳遞給一個小部件,主要是說「當事情發生時調用這個函數」。函數是 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 模式?

ScopedModel 和 BLoC(業務邏輯組件)是常見的 Flutter 應用程序架構模式,可幫助將業務邏輯與 UI 代碼分離,並使用更少的有狀態 widget。更好的資源來學習這些,我不認爲有理由在幾行中解釋它們。

我但願這篇文章可以消除一些疑問,而且我將盡力更新我遇到的常見問題。若是你喜歡這篇文章,請給我一些鼓勵,若是你但願我添加其餘問題,請務必發表評論。

若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索