天天看點

每個 Flutter 開發人員都應該知道的 16 個 Dart 技巧和竅門(第三節)

上一周給大家帶來了flutter系列的第一二期

flutter的安裝與設定(第一節)

35分鐘教你學會dart(第二節)

尤其通過第二節的學習,相信大家對dart基礎已經有了一定的掌握。

今天特意給大家帶來我在開發中總結的dart相關的16個技巧

這是一個簡單的程式,顯示如何使用字元串乘法列印中國加油,甘肅挺住:

我的家鄉甘肅現在生病了,但我相信他會好起來的!

是不是很酷?😉,是的我相信甘肅可以挺住的!

您可以使用它來檢查長字元串如何适合<code>text</code>小部件:

考慮這個模拟 api 類,它告訴我們最新的 covid 病例數:

要同時執行所有這些futures,請使用<code>future.wait</code>. 這需要一個清單或 futures and returns a future of lists**:

this is ideal when the futures are independent, and they don't need to execute sequentially.

這是一個示例<code>passwordvalidator</code>類:

因為該方法名為<code>call</code>,我們可以聲明一個類執行個體并将其用作方法:

假設我們有一個自定義小部件類,它應該<code>ondragcompleted</code>在發生特定事件時調用回調:

要調用回調,我們可以編寫以下代碼:

但是有一個更簡單的方法(注意使用<code>?.</code>):

在 dart 中,函數是一等公民,可以作為參數傳遞給其他函數。

下面是一些定義匿名函數并将其配置設定給<code>sayhi</code>變量的代碼:

然後<code>sayhi</code>傳遞給一個<code>welcome</code>函數,該函數接受一個<code>function</code>參數并使用它來迎接使用者。

<code>string function(string)</code>是一個函數類型,它接受一個<code>string</code>參數并傳回一個<code>string</code>. 因為上面的匿名函數具有相同的簽名,它可以直接作為參數傳遞,也可以通過變量傳遞<code>sayhi</code>。

使用功能等營運商時,這種編碼風格是常見的<code>map</code>,<code>where</code>和<code>reduce</code>。

例如,這是一個計算數字平方的簡單函數:

給定一個值清單,我們可以映射:

這裡我們<code>square</code>作為參數傳遞,因為它的簽名正是 map 操作符所期望的。這意味着我們不需要用匿名函數擴充它:

當您将 ui 作為代碼編寫時,collection-if 和 spreads 非常有用。

但是您知道您也可以将它們與maps一起使用嗎?

考慮這個例子:

這裡我們聲明一個<code>restaurant</code>maps,隻添加<code>avgrating</code>和<code>numratings</code>鍵值對,如果<code>addratings</code>是<code>true</code>。因為我們要添加多個鍵值對,是以我們需要使用擴充運算符 ( <code>...</code>)。

假設你有map:

以下是如何編寫循環以使用所有鍵值對運作一些代碼:

通過疊代<code>entries</code>變量,您可以以空安全的方式通路所有鍵值對。

這比這更簡潔,更不容易出錯:

上面的代碼<code>!</code>在讀取值時需要使用斷言運算符 ( ),因為 dart 不能保證給定鍵的值存在。

假設您要聲明一個表示溫度值的類。

你可以讓你的類api明确支援兩個攝氏和華氏兩種命名的構造函數:

這個類隻需要一個存儲變量來表示溫度,并使用初始化清單将華氏溫度轉換為攝氏溫度。

這意味着您可以像這樣聲明溫度值:

在<code>temperature</code>上面的類中,<code>celsius</code>被聲明為存儲變量。

但是使用者可能更喜歡以華氏度擷取或設定溫度。

這可以使用 getter 和 setter 輕松完成,它們允許您定義計算變量。這是更新的課程:

這使得使用華氏度或攝氏度輕松擷取或設定溫度:

注意:使用命名構造函數、getter 和 setter 來改進類的設計。

在 flutter 中,我們經常使用帶有函數參數的小部件。一個常見的例子是<code>listview.builder</code>:

在這種情況下,我們不使用<code>(context, index)</code>的參數<code>itembuilder</code>。是以我們可以用下劃線代替它們:

注意:這兩個參數是不同的 (<code>_</code>和<code>__</code>),因為它們是單獨的辨別符。

單例最重要的特性是整個程式中隻能有一個它的執行個體。這對于模組化檔案系統之類的東西很有用。

要在 dart 中建立單例,您可以聲明一個命名構造函數并使用<code>_</code>文法将其設為私有。

然後,您可以使用它來建立類的一個靜态最終執行個體。

是以,其他檔案中的任何代碼都隻能通過<code>instance</code>變量通路此類:

注意:如果您不小心,final可能會導緻許多問題。在使用它們之前,請確定您了解它們的缺點。

dart 中最常用的集合類型是<code>list</code>.

但是清單可以有重複的項目,有時這不是我們想要的:

我們可以<code>set</code>在需要一組唯一值時使用 a (請注意 的使用<code>final</code>):

上面的代碼生成一個警告,因為<code>深圳</code>出現了兩次。如果我們嘗試對<code>const</code>set執行相同的操作,則會收到錯誤并且我們的代碼無法編譯:

我們能夠獲得有用的api,如<code>union</code>,<code>difference</code>和<code>intersection</code>:

底線:當你建立一個集合時,問問自己你是否希望它的項目是獨一無二的,并考慮使用一個集合。

<code>try</code>并且<code>catch</code>在使用基于 future 的 api 時非常理想,如果出現問題,這些 api 可能會引發異常。

這是一個完整的示例,展示了如何充分利用它們:

一些注意事項:

您可以添加多個<code>on</code>子句來處理不同類型的異常。

您可以使用回退<code>catch</code>子句來處理與上述任何類型都不比對的所有異常。

您可以使用<code>rethrow</code>語句将目前異常向上抛出調用堆棧,同時保留堆棧跟蹤。

您可以使用<code>finally</code>在<code>future</code>完成後運作一些代碼,無論它是成功還是失敗。

如果您正在使用或設計一些基于 future 的 api,請確定根據需要處理異常。

dart<code>future</code>類帶有一些友善的工廠構造函數:<code>future.delayed</code>,<code>future.value</code>和<code>future.error</code>。

我們可以<code>future.delayed</code>用來建立一個<code>future</code>等待一定延遲的。第二個參數是一個(可選的)匿名函數,你可以用它來完成一個值或抛出一個錯誤:

但有時我們想建立一個<code>future</code>立即完成的:

我們可以用<code>future.value</code>一個值來成功完成,或者<code>future.error</code>用一個錯誤來完成。

您可以使用這些構造函數來模拟來自基于 future 的 api 的響應。這在您的測試代碼中編寫模拟類時很有用。

stream 類還帶有一些友善的構造函數。以下是最常見的:

用于從值清單<code>stream.fromiterable</code>建立一個<code>stream</code>。

使用<code>stream.value</code>,如果你隻有一個值。

用于<code>stream.empty</code>建立空流。

用于<code>stream.error</code>建立包含錯誤值的流。

用于<code>stream.fromfuture</code>建立僅包含一個值的流,該值将在未來完成時可用。

用于<code>stream.periodic</code>建立周期性的事件流。您可以将 a 指定<code>duration</code>為事件之間的時間間隔,并指定一個匿名函數來生成給定其在流中的索引的每個值。

在 dart 中,我們可以将同步生成器定義為一個傳回 的函數<code>iterable</code>:

這使用<code>sync*</code>文法。在函數内部,我們可以“生成”或<code>yield</code>多個值。這些将<code>iterable</code>在函數完成時傳回。

另一方面,異步生成器是一個傳回 a 的函數<code>stream</code>:

這使用此<code>async*</code>文法。在函數内部,我們可以<code>yield</code>像在同步情況下一樣取值。

但是如果我們願意,我們可以使用<code>await</code>基于 future 的 api,因為這是一個異步生成器:

那麼今天的分享就要和大家說再見了,我們明天見,明天将給大家繼續帶來flutter的精彩内容。

大家有什麼疑問或者問題,都可以在留言區告訴我,如果喜歡今天的内容,歡迎大家點贊支援!