回答有關 Flutter App 開發的問題

這篇文章旨在解釋一些問題,而不是對每個方面的詳細表述。爲簡潔起見,我可能沒有涉及到一些例外情況。請注意,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 回調:

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。更好的資源來學習這些,我不認爲有理由在幾行中解釋它們。

我希望這篇文章能夠消除一些疑問,並且我將盡力更新我遇到的常見問題。如果你喜歡這篇文章,記得點擊關注!後續持續有文章更新發布喔

作者:僱個城管打天下
鏈接:https://juejin.im/post/5be98784518825170200254e
來源:掘金

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章