上一周給大家帶來了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的精彩内容。
大家有什麼疑問或者問題,都可以在留言區告訴我,如果喜歡今天的内容,歡迎大家點贊支援!