iT邦幫忙

2022 iThome 鐵人賽

0
自我挑戰組

C++30日挑戰之旅系列 第 36

【WIDE LAB紀錄 Day6】 Dart,讓我們繼續那靦腆的與你相識

  • 分享至 

  • xImage
  •  

壹、前情提要:交接工作進度銜接

前提:因為我們的flutter版本是2.10.5而非最新版本的3.7.0

一、趴呢part:進度、遇到的問題

  1. package部分採用直接安裝的方式會產生無法尋獲packge的問題或直接跑數以萬計的error
  2. pubspec.yaml手動新增的方式也會產生報錯

二、趴呢part:想法

  1. 因為假日有先看過dart語法,希望做出簡易login畫面,但由於上述套件問題待解決,先往以自己手刻的方向研究
  2. 先不貿然upgrade,怕flutter升級後因硬體環境導致不能用
  3. 我先繼續維持dart語言打底的部分,屆時再來處理package問題

三、銜接部分自己的想法

  1. 絕對不能upgrade,不然一定會壞掉,像當初由3.7.0降階到2.10.5的原因便是如此
  2. (自己當下的想法)若要使用package應該是要往flutter sdk 2.10.5的Official Docs尋找對應套件,而非直接在google上key "flutter package",道理同當初自己要安裝Xcode12.4時是要深入從Apple Developments More Downloads內的版本號尋找,而非直接在App Store打“Xcode”來下載

不過目前也還沒研究到package的part,所以先持續自己的進度,因為假設最糟的情況是套件皆不能用,那語法必然會變為最重要的part,且由語法、邏輯依序疊升到架構才可以在遇到error時舉一反三,且在學習語法的過程中也很常會看到senior提到junior容易犯錯的part或是debug常用的方式等小技巧,這幾點都會對開發扮演十分重要的角色!

貳、讓我們接續Dart語言阿囉哈:內建型別(續)

在dart語法部分要注意在參考資料(書籍或網站)的用法可能會因年份或新的更新而出現不同需注意的樣式!

一、字串與他們的操作

在dart的字串部分可以分為單引號雙引號三引號
https://ithelp.ithome.com.tw/upload/images/20230206/201515939JqcoPis6l.png

參自:String class

練習如下(其中我們可以看到三引號的連接會把空格也視為字元輸出)
https://ithelp.ithome.com.tw/upload/images/20230206/20151593ZjEczelPXo.png
字串的操作中我們也有帶到跟分割與字串搜尋有關的項目
https://ithelp.ithome.com.tw/upload/images/20230206/20151593bjb9xZUeih.png

參自:startsWith abstract method

字串的連接(說明如註解所示)
https://ithelp.ithome.com.tw/upload/images/20230206/201515936HDFgOrzYK.png

字串內嵌運算式,使用${expression}的方式
https://ithelp.ithome.com.tw/upload/images/20230206/20151593YQv9TmDaWw.png

二、Boolean

  • boolean通常用於if條件內的判斷
  • 只有true與false
  • Boolean值是Compiling時的變數
  • 可以藉由assert來判斷Boolean值

由下圖可以看出當assert的boolean值為true時,程式不報錯並且繼續執行,可以看到右方順利印出我們所設的“No problem”字串
https://ithelp.ithome.com.tw/upload/images/20230206/20151593OYmFPoOVXi.png
當assert出現false時會使程式報錯(Uncaught Error: Assertion failed),因此我們便可以藉由本方式來進行程式開發的偵錯
https://ithelp.ithome.com.tw/upload/images/20230206/20151593S6Y6nzPyUD.png

三、List與陣列

List與Set比較(與離散數學的定義相同)

   List<int> list = [1,2,2,3];//有排序可重複
   Set<int> set = {1,2,3};//無排序且不重複

https://ithelp.ithome.com.tw/upload/images/20230206/20151593dKxqQwNaBP.png

官方List說明List class

在依照書本使用new List()時跳出error,且error指向文件

https://ithelp.ithome.com.tw/upload/images/20230206/20151593nx4NwVoj1f.png
https://ithelp.ithome.com.tw/upload/images/20230206/20151593UhFFE4jLu7.png
https://ithelp.ithome.com.tw/upload/images/20230206/20151593hcw3BeATQd.png

flutter 診斷信息

藉由index對值進行修改(可以看到list由[1,2,3]變為[3,2,3])
https://ithelp.ithome.com.tw/upload/images/20230206/20151593XenQvwukzN.png

List練習
https://ithelp.ithome.com.tw/upload/images/20230206/20151593b4i1J7rjYH.png

list.forEach()補充
https://ithelp.ithome.com.tw/upload/images/20230206/20151593OkLogmdXLY.png

參自:Looping: for-in and forEach

四、Map

相當於dictionary,key value

我們可以用宣告的方式建立map

  var computer = {"name":"mac","company":"Apple"};//{key:value,key:value}對應
  var computer = const{"name":"mac","company":"Apple"};//固定(常數)map

或是用建置(new Map())的方式,也可以清除單一key值或整個map
https://ithelp.ithome.com.tw/upload/images/20230206/20151593bG3k90Bqx0.png

五、Dynamic和Object與其他型別

在Dart中,可以將一切事物都視為物件,且Objects是所有物件的父物件,而當我們沒有對變數進行型別設置時,Compiler會自行根據值來定義其類型,但為了加快執行速度,均建議為變數定義確定的型別。
https://ithelp.ithome.com.tw/upload/images/20230206/20151593LVGAxHppWS.png
https://ithelp.ithome.com.tw/upload/images/20230206/20151593OiFvc9hD3F.png

兩圖均參自Flutter 30: from start to store:DAY3:Dart語法簡介:型別和條件語句

參、讓我們接續Dart語言阿囉哈:運算子

一、三目運算子

expr1 ?? expr2的方式來決定回傳值,如下圖所示,初始a=20,那由兩個expr1的不同(a<10,a>10)可以看到輸出的val1值與val2值差異
https://ithelp.ithome.com.tw/upload/images/20230207/20151593srYk077eau.png

二、除法取商數的運算子

~/表示除法取商數,如下圖所示
https://ithelp.ithome.com.tw/upload/images/20230207/201515935JIiWpJulO.png

三、串聯運算符號

..的方式串聯,未來多用於動畫的部分,下圖以String作為範例
https://ithelp.ithome.com.tw/upload/images/20230207/20151593wsybm2IqfJ.png

四、as、is、is!

as
https://ithelp.ithome.com.tw/upload/images/20230207/20151593bTDglxsthO.png

取自as property

as,is,is!程式碼補充

void main() {

  dynamic obj =<String,int>{};
  if(obj is Map<String,int>){ //"is":如果物件具有指定類型則為true
                              //補充"is!"如果物件具有指定類型則為false
    obj['age'] = 20;
  }
  
  var map = obj as Map<String, int>;//“as”:判斷屬於某種類型
}

肆、讓我們接續Dart語言阿囉哈:例外、異常(Exception)與捕捉方式

官方Exception class API
https://ithelp.ithome.com.tw/upload/images/20230207/20151593P4abYrwmy7.png
https://ithelp.ithome.com.tw/upload/images/20230207/20151593nD4JfANVVX.png

取自:Exception class

官方catchError abstract method API
https://ithelp.ithome.com.tw/upload/images/20230207/20151593V0oOyDzP7M.png

取自:catchError abstract method

https://ithelp.ithome.com.tw/upload/images/20230207/20151593w9UxBuidkX.png

取自:Dart 語言 - 開啟 Flutter 的鑰匙:DAY13例外處理

一、Throw error

可以用throw exception('自行輸入文字')的方式自己定義error並在執行到該處的時候會跳出(方便debug),像執行後右方所顯示的
https://ithelp.ithome.com.tw/upload/images/20230207/20151593IEEo1Hlpzq.png

二、Try/Cache/Finaly

基本框架

 try{
    //捕捉特定異常
  } on AuthorizationException catch(e){
    //捕捉特定類型的異常但不需要此物件
  } on Exception{
    //捕捉所有異常
  } catch(error){
    //...
  }finally{
    //...
  }

原始:迴圈錯誤,右方紅字顯示“Uncaught Error”,且後續的程式會被終止執行(無法輸出“Hi”)
https://ithelp.ithome.com.tw/upload/images/20230207/20151593JBakXG3hsn.png

try/catch捕捉error:右方白字顯示錯誤名稱,並且程式會繼續進行(輸出“Hi”)
https://ithelp.ithome.com.tw/upload/images/20230207/20151593fAf6el0ufS.png

finally:可以加在try-catch後方且finally內的程式碼一定會被呼叫到
https://ithelp.ithome.com.tw/upload/images/20230207/20151593zaGSqFWTPd.png

三、除官方外自行製作error

可以自行以class定義error描述
https://ithelp.ithome.com.tw/upload/images/20230207/20151593YclifXEQVH.png


連結之海


上一篇
【WIDE LAB紀錄 Day5】 Dart語言阿囉哈
下一篇
【WIDE LAB紀錄 Day7】 Dart,讓我更深層的了解你的為人
系列文
C++30日挑戰之旅43
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言