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

僱個城管打天下發表於2019-03-03

通過我的講座和研討會在與很多學生和開發人員親自交流後,我意識到他們中很多人都對 Flutter 和應用程式開發有共同的問題,甚至還有誤解。因此我決定去寫一篇文章來解釋這些普遍的疑惑。注意,這篇文章旨在解釋一些問題,而不是對每個方面的詳細表述。為簡潔起見,我可能沒有涉及到一些例外情況。請注意,Flutter 本身也有一個針對各種背景下的常問問題頁面 flutter.io,在這裡我將更多地關注我經常看到的問題。雖然其中一些也包含在 Flutter 常見問題解答中,但是我還是嘗試著去給出我的觀點。

佈局檔案在哪裡?/ 為什麼 Flutter 沒有佈局檔案?

在 Android 框架中,我們將 Activity 分為佈局和程式碼。因此,我們需要引用檢視以在 Java 中使用它們。(當然 Kotlin 可以避免這種情況。)佈局檔案本身用 XML 編寫,包含 Views 和 ViewGroups。

Flutter 使用一種全新的方法,而不是檢視,使用 Widget。在 Android 中,View 就是佈局的一個元件,但在 Flutter 中,Widget 幾乎就是一切。從按鈕到佈局結構,所有的這些都是一個 Widget。他在這裡的優勢是可定製性。想象一下 Android 中的一個按鈕。它具有文字等屬性,可讓你向按鈕新增文字。但 Flutter 中的按鈕不會將標題作為字串,而是另一個 widget。這意味著,在按鈕內部,您可以擁有文字,影像,圖示以及您可以想象的任何內容,並且不會破壞佈局約束。這也讓你可以很容易地製作自定義 Widget,而在 Android 中製作自定義 view 是一件相當困難的事情。

拖放不比在程式碼中進行佈局更容易嗎?

在某些方面,這是事實。但 Flutter 社群中的很多人都更喜歡程式碼方式,但這並不意味著拖放無法實現。如果你完全喜歡拖放,那麼 Flutter Studio 是我推薦的一個很棒的資源,它可以通過拖放幫助你生成佈局。這是一個讓我印象深刻的工具,很想知道它將來會如何發展。

連結: flutterstudio.app

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 開始嗎?

這有兩部分答案。

  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前端後端區塊鏈產品設計人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章