天天看點

35分鐘教你學會dartCollectionsFunctions

35分鐘教你學會dartCollectionsFunctions

這是我目前暫定的目錄,後面可能會有所改變,

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

35分鐘教你學會dartCollectionsFunctions

這是flutter系列的第二節,

其實說35分鐘教你學會dart,有點言過其實了,不過你依舊可以在這篇文章中學到了解 dart 基礎知識

例如:

變量、資料類型和運算符

條件和循環

collection

function

完成後,您就可以直接使用 dart 進行 flutter 開發了。

單擊頁面頂部或底部的“下載下傳資料”按鈕下載下傳示例代碼。您不會在本教程中建構示例項目,但可以使用編碼示例作為參考。

您可以将main.dart 中的代碼粘貼到 dartpad 中,也可以使用dart sdk運作該檔案。

要快速入門,最好使用開源工具dartpad,它可以讓您通過 web 浏覽器編寫和測試 dart 代碼:

35分鐘教你學會dartCollectionsFunctions

dartpad 的設定類似于典型的 ide。它包括以下元件:

編輯器窗格:位于左側。您的代碼将放在此處。

run 按鈕:在編輯器中運作代碼。

控制台:位于右上角,顯示輸出。

文檔面闆:位于右下角,顯示有關代碼的資訊。

示例:此下拉清單顯示了一些示例代碼。

null safety 按鈕:使用此按鈕可選擇加入 dart 的新聲音零安全功能。

版本資訊:在右下角,dartpad 顯示目前使用的 flutter 和 dart 版本。

如果您願意,可以在您的機器上本地安裝 dart sdk。一種方法是安裝 flutter sdk。安裝 flutter 也會安裝 dart sdk。

要直接安裝 dart sdk,請通路https://dart.dev/get-dart。

dart 與 java、c#、swift 和 kotlin 等其他語言有許多相似之處。它的一些功能包括:

靜态類型

類型推斷

字元串表達式

多範式,包括面向對象和函數式程式設計

空安全

dart 已針對在各種平台上開發快速應用程式進行了優化。

dart 程式以調用<code>main</code>. dart 的文法<code>main</code>看起來類似于 c、swift 或 kotlin 等其他語言的文法。

清除預設 dartpad 中的所有代碼并添加<code>main</code>到編輯器中:

你會看到之前有一個傳回類型<code>main</code>。在這種情況下,它是<code>void</code>,意味着<code>main</code>不會傳回任何東西。

後面的括号<code>main</code>表示這是一個函數定義。大括号包含函數體。

在裡面<code>main</code>,你為你的程式添加 dart 代碼。

接下來,您将了解有關以下核心概念的更多資訊:

變量、注釋和資料類型

基本dart類型

operators

字元串

不變性

可空性

條件和中斷

for 循環

是時候深入了解了

您要添加的第一件事<code>main</code>是變量指派語句。變量儲存您的程式将處理的資料。

您可以将變量視為計算機記憶體中儲存值的盒子。每個框都有一個名稱,即變量的名稱。要使用 dart 表示變量,請使用<code>var</code>關鍵字。

添加一個新變量到<code>main</code>:

每個 dart 語句都以分号結尾,就像 c 和 java 中的語句一樣。在上面的代碼中,您建立了一個變量<code>myage</code>,并将其設定為等于35。

您可以使用<code>print</code>dart 中的内置将變量列印到控制台。在變量之後添加該調用:

在 dartpad 中單擊run以運作代碼。您将在控制台中看到變量的值35。

35分鐘教你學會dartCollectionsFunctions

dart 中的注釋與 c 和其他語言中的注釋類似:後面的文本<code>//</code>是單行注釋,而其中的文本<code>/* ... */</code>是多行注釋塊。

下面是一個例子:

dart 是靜态類型的,這意味着 dart 中的每個變量都有一個在編譯代碼時必須知道的類型。運作程式時變量類型不能改變。c、java、swift 和 kotlin 也是靜态類型的。

這與動态類型的python 和 javascript 等語言形成對比。這意味着在運作程式時變量可以儲存不同類型的資料。編譯代碼時不需要知道類型。

單擊<code>myage</code>編輯器視窗并檢視文檔面闆。你會看到 dart推斷出它<code>myage</code>是一個,<code>int</code>因為它是用整數值35初始化的。

如果您沒有明确指定資料類型,dart 會使用類型推斷來嘗試确定它,就像 swift 和 kotlin 所做的那樣。

35分鐘教你學會dartCollectionsFunctions

dart 還對<code>int</code>. 輸入一個變量,<code>pi</code>,等于 3.14:

dart 推斷<code>pi</code>為 a 是<code>double</code>因為您使用了一個浮點值來初始化它。您可以在 dart 資訊面闆中通過單擊 來驗證<code>pi</code>。

35分鐘教你學會dartCollectionsFunctions

或者,您可以聲明類型,而不是使用類型推斷。

dart 使用以下基本類型:

int : 整數

double : 浮點數

bool : 布爾值

字元串:字元序列

以下是每種 dart 類型的示例:

35分鐘教你學會dartCollectionsFunctions

<code>int</code>并且<code>double</code>都派生自一個名為<code>num</code>. <code>num</code>使用<code>dynamic</code>關鍵字來模拟靜态類型 dart 中的dynamic類型。

通過替換<code>var</code>為您要使用的類型來執行此操作:

如果您使用<code>dynamic</code>關鍵字而不是<code>var</code>,您将獲得有效的dynamic類型變量:

在這裡,您可以設定<code>numberofkittens</code>為<code>string</code>使用引号。您将在本教程的後面了解有關<code>string</code>該類型的更多資訊。

<code>numberofkittens</code>有一個類型,因為 dart 有靜态類型。但該類型是<code>dynamic</code>,這意味着您可以為它配置設定具有其他類型的其他值。是以,您可以<code>int</code>在列印語句下方配置設定一個值。

或者,如果你在薛定谔的盒子裡有一隻小貓,你可以指派<code>double</code>:

35分鐘教你學會dartCollectionsFunctions

單擊運作以檢視<code>numberofkittens</code>控制台中列印的三個不同值。在每種情況下, 的類型<code>numberofkittens</code>仍然存在<code>dynamic</code>,即使變量本身持有不同類型的值。

35分鐘教你學會dartCollectionsFunctions

該<code>bool</code>類型包含<code>true</code>或 的值<code>false</code>。

但是,如果你看看薛定谔的盒子,你可能會轉而養一隻活生生的小貓:

再次運作代碼以在控制台中檢視您的布爾值。你在盒子裡看是一件好事!:]

35分鐘教你學會dartCollectionsFunctions

dart 具有您在其他語言(如 c、swift 和 kotlin)中熟悉的所有常用運算符。

dart 運算符的一些示例包括:

算術

==

遞增和遞減

比較

邏輯運算符

注意:dart 還允許運算符重載,就像在 c++ 和 kotlin 中一樣,但這超出了本教程的範圍。要了解有關該主題的更多資訊,請通路 wikipedia 的overator 重載頁面。

接下來,您将了解這些運算符中的每一個。

算術運算符的工作方式與您期望的一樣。通過向 dartpad 添加一系列操作來嘗試它們:

對于除法,即使是整數,dart 也會将結果變量推斷為 a <code>double</code>。這就是為什麼最後一條語句得到42.0而不是 42的原因<code>print</code>。

注意:dartpad 在控制台中将“84 / 2”的結果顯示為 42,因為它将輸出到控制台的格式設定為僅顯示有效數字。如果您在 dart sdk 的 dart 程式中列印相同的語句,您将得到42.0作為結果。

dart 使用雙等于( <code>==</code>) 等于和不等于( <code>!=</code>) 運算符:

dart 使用典型的比較運算符:

小于 (&lt;)

大于 (&gt;)

等于 (=&gt;)

這裡有些例子:

此外,它還使用常用的複合算術/指派運算符:

複合算術/指派運算符執行兩項任務。<code>+=</code>将右邊的值與左邊的變量相加,然後将結果賦給變量。

的縮寫形式<code>+= 1</code>是<code>++</code>:

dart 有通常的模運算符 ( <code>%</code>) 來傳回一個數除以另一個數後的餘數:

392 ÷ 50 = 7.84,但結果窗格中的 42 來自哪裡?用長除法更容易看到。

35分鐘教你學會dartCollectionsFunctions

dart使用相同的邏輯運算符為其他語言,包括<code>&amp;&amp;</code>了和和<code>||</code>的or。

否定運算符是感歎号,它把假變成真,真變成假。

有關dart運算符的完整清單,請參閱 dart 文檔。

dart 字元串類型是<code>string</code>. 字元串在 dart 中使用由*單*引号或雙引号括起來的文本表示。

您可以使用<code>var</code>and 類型推斷或<code>string</code>建立字元串變量,就像您見過的其他類型一樣:

與 kotlin 和 swift 等語言類似,您可以使用美元符号将表達式的值嵌入到字元串中:${ *expression* }。

如果表達式是辨別符,則可以省略{ }。添加以下内容:

<code>$firstname</code>和<code>$lastname</code>由可變值替換。在``傳回計算的結果。

dart 中使用的轉義序列類似于其他類 c 語言中使用的轉義序列。例如,您用于<code>\n</code>換行。

如果字元串中有特殊字元,請使用<code>\</code>轉義它們:

此示例使用單引号,是以它需要一個轉義序列 ,<code>\'</code>将can't和don't的撇号嵌入到字元串中。如果您改用雙引号,則不需要轉義撇号。

如果您需要在字元串中顯示轉義序列,您可以使用以 為字首的原始字元串<code>r</code>。

在這裡,dart 将其<code>\n</code>視為普通文本,因為字元串以<code>r</code>.

單擊dartpad 中的run以在控制台中檢視所有字元串。

35分鐘教你學會dartCollectionsFunctions

dart 使用關鍵字<code>const</code>和<code>final</code>不改變的值。

使用<code>const</code>對于那些在編譯時已知值。使用<code>final</code>了不具備在編譯時已知的,但初始化後不能被重新配置設定的值。

注意:<code>final</code>就像<code>val</code>在 kotlin 或<code>let</code>swift 中一樣。

您可以使用<code>const</code>and<code>final</code>代替<code>var</code>并讓類型推斷确定類型:

在這裡,dart 推斷這<code>speedoflight</code>是一個<code>int</code>,正如您在 dartpad 的資訊面闆中看到的那樣。

35分鐘教你學會dartCollectionsFunctions

<code>final</code>表示變量是不可變的,這意味着您不能重新配置設定<code>final</code>值。您可以使用<code>final</code>或顯式聲明類型<code>const</code>:

過去,如果你沒有初始化一個變量,dart 會給它指派<code>null</code>,這意味着變量中沒有存儲任何内容。不過,從 dart 2.12 開始,dart 加入了其他語言,如 swift 和 kotlin,預設情況下不可為空。

此外,dart保證不可為空的類型永遠不會包含空值。這被稱為空安全。

通常,如果要聲明一個變量,必須對其進行初始化:

但是,并非每個人都有中間名,是以建立<code>middlename</code>一個可為空的值是有意義的。要告訴 dart 您想要允許 value <code>null</code>,請<code>?</code>在類型後添加。

可空類型的預設值是<code>null</code>,是以您可以将表達式簡化為以下内容:

運作它并<code>null</code>列印到控制台。

35分鐘教你學會dartCollectionsFunctions

dart 有一些可識别空值的運算符,您可以在處理空值時使用。

雙問号運算符 ,<code>??</code>就像kotlin 中的elvis 運算符:如果對象不為空,它傳回左側操作數。否則,它傳回右邊的值:

由于<code>middlename</code>is <code>null</code>,dart 配置設定 的右側值<code>'none'</code>。

該<code>?.運算符保護您通路空對象的屬性。</code>null`如果對象本身為空,則傳回。否則,它傳回右側屬性的值:

在空安全之前的日子裡,如果你忘記了問号并寫了<code>middlename.length</code>,如果<code>middlename</code>為空,你的應用程式會在運作時崩潰。這不再是問題,因為 dart 現在會立即告訴您何時需要處理空值。

控制流可讓您決定何時執行、跳過或重複某些代碼行。您可以使用條件和循環來處理 dart 中的控制流。

在本節中,您将了解更多關于:

條件句

while 循環

繼續和中斷

以下是您需要了解的有關 dart 中的控制流元素的資訊。

控制流的最基本形式是根據程式運作時發生的條件決定是執行還是跳過代碼的某些部分。

處理條件的語言結構是<code>if</code>/<code>else</code>語句。<code>if</code>/<code>else</code>在 dart 中看起來幾乎與它在其他類 c 語言中的使用相同。

假設您有一個變量,<code>animal</code>,它目前是一隻狐狸。它看起來像這樣:

35分鐘教你學會dartCollectionsFunctions

您可以使用<code>if</code>語句來檢查<code>animal</code>是貓還是狗,然後運作一些相應的代碼。

在這裡,您使用了相等和or運算符<code>bool</code>為<code>if</code>語句建立了一個内部條件。

使用<code>else</code>子句,如果條件為假,您可以運作替代代碼:

您也可以将多個組合<code>if</code>/<code>else</code>語句成<code>if</code>/ <code>else if</code>/<code>else</code>結構:

你可以有很多<code>else if</code>分支之間<code>if</code>,并<code>else</code>根據您的需要。

循環允許您重複代碼一定次數或基于特定條件。您可以使用while 循環處理基于條件的重複。

dart 中有兩種形式的 while 循環:<code>while</code>和<code>do-while</code>。不同之處在于 for <code>while</code>,循環條件發生在代碼塊之前。在<code>do-while</code>,條件發生在之後。這意味着<code>do-while</code>循環確定代碼塊至少運作一次。

要嘗試此操作,請建立一個<code>i</code>初始化為 1的變量:

接下來,使用<code>while</code>循環<code>i</code>在遞增時列印。設定條件<code>i</code>為小于10:

運作代碼,您将看到<code>while</code>循環列印數字 1 到 9。

<code>i</code>在 dartpad 中重置,然後添加一個<code>do-while</code>循環:

結果和以前一樣。然而這一次,循環體在檢查循環退出條件之前運作了一次。

dart在循環和其他地方使用<code>continue</code>和<code>break</code>關鍵字。以下是他們所做的:

continue:跳過循環中剩餘的代碼并立即進入下一次疊代。

break:停止循環并在循環體之後繼續執行。

<code>continue</code>在代碼中使用時要小心。例如,如果您<code>do-while</code>從上面進行循環,并且您希望在<code>i</code>等于 5時繼續,則可能會導緻無限循環,具體取決于您放置<code>continue</code>語句的位置:

發生無限循環的原因是,一旦<code>i</code>為 5,您就不會再增加它,是以條件始終為真。

如果在 dartpad 中運作它,無限循環将導緻浏覽器挂起。相反,使用<code>break</code>,是以循環在<code>i</code>達到 5後結束:

運作代碼。現在,循環在五次疊代後結束。

在 dart 中,您使用<code>for</code>循環來循環預定次數。<code>for</code>循環由初始化、循環條件和動作組成。再一次,它們類似于<code>for</code>其他語言中的循環。

dart 還提供了一個<code>for-in</code>循環,它周遊一組對象。稍後您将了解有關這些的更多資訊。

要檢視<code>for</code>循環的工作原理,請為總和建立一個變量:

接下來,使用<code>for</code>循環将循環計數器從<code>i</code>1初始化。然後您将檢查它<code>i</code>是否小于或等于 10,并<code>i</code>在每次循環後遞增。

在循環内,使用複合指派添加<code>i</code>到運作總和:

在 dartpad 中運作您的代碼以檢視總和。

35分鐘教你學會dartCollectionsFunctions

集合對于對相關資料進行分組很有用。dart 包括幾種不同類型的集合,但本教程将介紹兩種最常見的:<code>list</code>和<code>map</code>.

dart 中的清單類似于其他語言中的數組。您可以使用它們來維護有序的值清單。清單是從零開始的,是以清單中的第一項位于索引 0 處:

35分鐘教你學會dartCollectionsFunctions

以下是不同甜點的清單:

您将清單的元素括在方括号中:<code>[ ]</code>。使用逗号分隔元素。

在該行的開頭,您可以看到類型為<code>list</code>。您會注意到沒有包含類型。dart 推斷該清單具有類型。<code>list</code>

這是一個整數清單:

單擊<code>numbers</code>dartpad,您将看到 dart 将類型識别為 a <code>list</code>of <code>int</code>。

35分鐘教你學會dartCollectionsFunctions

要通路清單的元素,請使用下标表示法,将索引号放在清單變量名稱之後的方括号之間。例如:

由于清單索引是從零開始的,是以<code>desserts[0]</code>是清單的第一個元素。

分别使用<code>add</code>和 來添加和删除元素<code>remove</code>:

運作代碼檢視結果。

35分鐘教你學會dartCollectionsFunctions

早些時候,您了解了<code>for</code>循環。dart 的<code>for-in</code>循環尤其适用于清單。試試看:

您不需要使用索引。dart 隻是周遊 的每個元素<code>desserts</code>并将其每次配置設定給名為 的變量<code>dessert</code>。

餓了?好吧,在你吃完蔬菜之前,你不能吃任何甜點。:]

當你想要一個配對值清單時,<code>map</code>是一個不錯的選擇。dart<code>map</code>類似于swift 中的字典和kotlin 中的映射。

35分鐘教你學會dartCollectionsFunctions

以下是 dart 中的地圖示例:

您圍繞<code>map</code>s的花括号<code>{ }</code>。使用逗号分隔地圖的元素。

映射的元素稱為鍵值對,其中鍵位于冒号左側,值位于右側。

您可以通過使用鍵查找值來查找值,如下所示:

鍵 ,<code>'donuts'</code>位于地圖名稱後面的方括号内。在這種情況下,它映射到 的值<code>150</code>。

單擊<code>donutcalories</code>dartpad,您将看到推斷的類型是<code>int?</code>而不是<code>int</code>。這是因為,如果地圖不包含您要查找的鍵,它将傳回一個<code>null</code>值。

35分鐘教你學會dartCollectionsFunctions

通過指定鍵并為其配置設定值來向映射添加新元素:

運作該代碼,您将看到以水準格式列印的地圖,最後是您的新甜點。

函數使您可以将多行相關代碼打包到一個主體中。然後調用該函數以避免在整個 dart 應用程式中重複這些代碼行。

35分鐘教你學會dartCollectionsFunctions

一個函數由以下元素組成:

傳回類型

函數名

括号中的參數清單

括在括号中的函數體

您要轉換為函數的代碼位于大括号内。調用函數時,傳入與函數參數類型比對的參數。

接下來,您将在 dartpad 中編寫一個新函數,該函數将檢查給定的字元串是否為香蕉:

該函數用于<code>return</code>傳回一個<code>bool</code>. 您傳遞給函數的參數決定了<code>bool</code>.

對于任何給定的輸入,此函數将始終傳回相同的值類型。如果函數不需要傳回值,您可以将傳回類型設定為<code>void</code>. <code>main</code>例如,這樣做。

您可以通過傳入字元串來調用該函數。然後,您可以将該調用的結果傳遞給<code>print</code>:

通常,您可以在其他函數外部或 dart 類内部定義函數。但是,您也可以嵌套 dart 函數。例如,您可以嵌套<code>isbanana</code>在<code>main</code>.

您還可以将參數更改為函數,然後使用新參數再次調用它:

調用函數的結果完全取決于你傳入的參數。

如果函數的參數是可選的,您可以用方括号将其括起來并使類型可以為空:

在這個函數中,<code>title</code>是可選的。<code>null</code>如果您不指定它,它将預設為。

現在,您可以使用或不使用可選參數調用該函數:

當您有多個參數時,很難記住哪個是哪個。dart解決了這一難題命名參數,您可以通過與周圍大括号參數清單獲得:<code>{ }</code>。

預設情況下,這些參數是可選的,但您可以為它們提供預設值或使用<code>required</code>關鍵字使它們成為必需:

<code>value</code>是必需的,而<code>min</code>和<code>max</code>是可選的,具有預設值。

使用命名參數,您可以通過提供帶有冒号的參數名稱以不同的順序傳遞參數:

調用函數時,您可以不使用預設值的參數。

運作您的代碼以檢視正在運作的新函數。

35分鐘教你學會dartCollectionsFunctions

dart 支援一流的 functions,這意味着它像對待任何其他資料類型一樣對待函數。您可以将它們配置設定給變量,将它們作為參數傳遞并從其他函數中傳回它們。

要将這些函數作為值傳遞,請省略函數名稱和傳回類型。由于沒有名稱,這種類型的函數稱為匿名函數。

35分鐘教你學會dartCollectionsFunctions

您可以将匿名函數配置設定給名為 的變量<code>onpressed</code>,如下所示:

<code>onpressed</code>有一個類型的值<code>function</code>。空括号表示該函數沒有參數。與正常函數一樣,大括号内的代碼是函數體。

要在函數體内執行代碼,請調用變量名,就像它是函數名一樣:

您可以使用箭頭文法簡化函數體僅包含一行的函數。為此,請移除大括号并添加一個粗箭頭<code>=&amp;gt;</code>。

這是上面匿名函數和重構版本的比較:

讀起來好多了。

你會經常看到 flutter 中的匿名函數,就像上面的那些,作為 ui 事件的回調傳遞。這使您可以指定在使用者執行某些操作(例如按下按鈕)時運作的代碼。

您會看到匿名函數的另一個常見地方是集合。您可以為集合提供一個匿名函數,該函數将對集合的每個元素執行某些任務。例如:

讓我們看看每一步:

定義一個<code>drinks</code>包含小寫字母的清單。

<code>.map</code> 擷取所有清單值并傳回一個帶有它們的新集合。

匿名函數作為參數傳遞。在該匿名函數中,您有一個<code>drink</code>表示清單中每個元素的參數。

匿名函數的主體将每個元素轉換為大寫并傳回值。由于原始清單是字元串清單,是以<code>drink</code>也有 type <code>string</code>。

使用匿名函數并将其與它結合<code>.map</code>是将一個集合轉換為另一個集合的便捷方式。

注意:不要将<code>.map</code>方法與<code>map</code>類型混淆。

運作代碼以檢視生成的集合。

35分鐘教你學會dartCollectionsFunctions

恭喜,您已閱讀完本教程。您現在應該對學習如何建構 flutter 應用程式時看到的 dart 代碼有了更好的了解!

另外,請檢視官方 dart 文檔。

我希望你喜歡這篇關于 dart 基礎知識的簡短介紹。可以給我點贊,如果您有任何問題或意見,請評論區告訴我

我們下周見,下周将給大家分享更多的新鮮知識,當然如果你覺得這篇文檔有點看不懂,需要更基礎的,我也可以在後面準備一個手把手dart系列,請評論區告訴我!