Flutter的Dart語法入門

文章目錄

  • 前言
  • 1. 類型聲明
  • 2. 數據類型
    • 2.1 基本數據類型
      • 常量
    • 2.2 String
    • 2.3 集合
    • 2.4 unicode
  • 3. Dart函數特征
    • 3.1 可變參數列表和默認入參
    • 3.2 匿名函數
    • 3.3 typedef
  • 4. Dart面向對象
    • 4.1 構造函數
    • 4.2 訪問權限
    • 4.3 類的繼承
  • 參考資料
  • 附錄

前言

每個語言都有控制流語句就不寫測試代碼了。

Win11代碼測試方式:
你要把電腦中的flutter和dart環境都安裝上,然后在Android Studio中新建一個Dart項目或Flutter項目即可測試
沒有安裝的可以參考本文:https://blog.csdn.net/qq_41872247/article/details/139375636

新建一個dart文件,void main就可以在編譯器運行。
在這里插入圖片描述

1. 類型聲明

dart支持以下幾種類型聲明方式:

  • 和Java一模一樣的強類型聲明。
  • var開頭直接聲明一個對象,他會自己做類型推斷(同kotlin或者js)。
  • dynamic聲明,可變類型對象,就是可以動態賦值為不同的類型,編譯時對于dynamic聲明的對象不做類型檢查。
  • Object聲明,同dynamic,但是編譯時會將類型確定為Object,除了Object自帶的方法以外無法通過編譯(其實就是Java的Object)。
void main() {Obj obj = new Obj();obj.func();var obj1 = new Obj();obj1.func();var obj2;obj2 = new Obj1();obj2.funcc();dynamic obj3 = Obj();obj3.func();obj3 = Obj1();//obj3.func(); 可以編譯,但是無法運行obj3.funcc();Object obj4 = 3;//obj4 = obj4 + 4;  通不過編譯obj4 = "asdqwd";//obj4 = obj4.subString(0, 3) 通不過編譯obj4 = [3, 6, 9];print(obj4);
}class Obj {void func() {print("test");}
}class Obj1 {void funcc() {print("test1");}
}

2. 數據類型

2.1 基本數據類型

在java里面,int,double這種基本數據類型是沒有自帶方法的,只有封裝的Int和Double對象才有對應的方法,dart省略了這一步,直接就可以int,double,boolean進行一些方法處理。

Dart取消了使用率不高的byte,short,long這三個基本數據類型。

void main() {//int和double都繼承num.dart這個類,里面就有相關的api。int a = -4;print(a);print(a.toDouble());print(a.abs());//long a = 1; 無法過編譯//short a = 1; 無法過編譯//byte a = 1; 無法過編譯
}

不過,雖然自動封裝了對應的API,但是仍然是基礎數據類型,是值傳遞。

void main() {int a = -4;Obj o = new Obj();test(a);test(o.a);print(a);  // -4print(o.a);  // -4test2(o);print(o.a); // -1
}void test(int num) {num = num + 3;
}void test2(Obj obj) {obj.a = obj.a + 3;
}class Obj {int a = -4;
}

常量

Dart同時使用const關鍵字和final關鍵字,且如果是基礎數據類型的話就不需要聲明類型,他會自行做類型推斷。
const關鍵字聲明的是常量
final聲明的是可以定義一次的變量

const a = 1; // 聲明時不需要寫var,也不需要寫int
//const Obj o = Obj(); 編譯報錯
final a1 = 1;
final Obj o1 = Obj();
late final a2; // 后續再賦值void main() {//print(a2); 運行報錯//a1 = 3; 編譯報錯a2 = 3;
}class Obj {int a = 4;
}

2.2 String

  • String可以使用單引號,也可以使用雙引號,當使用雙引號的String時,內部的單引號就不需要轉義可以直接使用,反之也一樣。
  • String支持用取地址符(&)拼裝變量,和kotlin的一樣
  • 多個常量String拼接的時候不需要+,直接拼就行
  • String前面加上字符r,會自動忽略字符串的所有轉義符。
void main() {String str0 = "外側是雙引號,內側'單引號'不用轉義符";String str1 = '外側是單引號,內側"雙引號"不用轉義符';String str2 = "外側是雙引號,內側\"雙引號\"需要用轉義符";String str3 = "外側是單引號,內側\'單引號\'需要用轉義符";String str4 = str0 + str1 + "  $str0";String str5 = 'awdqwd''qwdqwd''qwdqwdqwd''qwdqwdqwd';String str6 = "adqwd""qwdqwdqwd";String str7 = "qww\nqwe";String str8 = r"qww\nwww";
}

2.3 集合

  • List和數組融合,可以直接用[]創建,不需要new List(語法優化)。
  • List內部沒有類型檢測,可以任意放東西進去。
  • Map采用字典的方式,可以直接用{}創建,可以用[]直接修改map。(語法優化)
  • 集合創建的時候可以用上const關鍵字,此時里面的數據類型只能是const類型,也就是常量。
void main() {List list = [];list.add("qqq");list.add(1);list.add(new Obj());Map map = {'qq': 'xiaobing', 'qqq':3, 'qqq1': new Obj()};map['12'] = 3;print(map);var a = new Obj();Map map1 = const {'qq': 'xiaobing', 'qqq':3, 'qqq1': a}; // a編譯不通過
}class Obj{}

2.4 unicode

  • 可以輸入String中不支持的一些字符
void main() {Runes runes = new Runes('\u{1f661} \u6211');print(String.fromCharCodes(runes));
}

3. Dart函數特征

Dart的函數語法模式和Java類似,也是一樣的返回類型在前,參數列表中也是類型在前的寫法。

void main() {print(test("a", "b")); // ab
}String test(String a, String b) {return a + b;
}

同時Dart語法中的參數是kotlin同款的空類型判斷的,在參數類型后面加上?表示該參數可以傳空值,不加就不能傳了。

void main() {print(test1("a", null));
}
// ?表示b這個參數可以傳空
String? test1(String a, String? b) {if(b != null) {return a+b;}return null; // 返回類型加上?后可以返回空
}

3.1 可變參數列表和默認入參

Dart不支持Java模式的函數重載,即函數名相同,參數列表或返回類型不同的多個函數同時存在,但是對應的是,Dart的函數支持可變參數列表,可以直接自定義必須要傳入的參數和可以傳也可以不傳的參數,用花括號{}。

void main() {print(test2("a", b: "b", c: null));
}// 在花括號里面的參數就是可以傳也可以不傳的,但是加了required關鍵字的還是必須要傳的
String test2(String a, {required String b, required String? c, String d="dddd", String? e}) {var str = "";if(c != null) {str += c;}if(e != null) {str += e;}return a + b + d + str;
}// 同時,作為可變參數,required,?,默認值三個模式中至少要有一個,都沒有的話就過不了編譯
String test20(String a, {String b}) { //編譯過不去return a;
}

中括號模式:也能用做可變參數列表,但是不支持required關鍵字

void main() {print(test3("a"));
}String test3(String a, [String b="bb", String? c="ccc", String? d]) {return a;
}
// 同上,都沒有過不了編譯
String test30(String a, [String b]) { return a;
}

3.2 匿名函數

和其他語法的萬物皆可對象是一個道理,可以單獨將一個函數聲明成對象,只是具體寫法上有不同,用箭頭表明。

void main() {// 單行直接用箭頭,返回類型自動推測var a = (int a, int b) => a + b;print(a(1, 2));// 多行用花括號,返回類型自動推測var b = (int a, int b) {a = a + 1;return a + b;};print(b(1, 2));//無返回類型Function c = () => print("ccc");//print(c()); // 編譯過不去,因為c返回類型是voidc();
}

當然你懂得,函數本身當然也可以作為函數的入參

void main() {test(() => print("a"), () => print("bb"));
}void test(Function a, Function b) {a();b();
}

3.3 typedef

typedef可以讓你將一個特定入參列表的匿名函數作為一個對象的類型,然后再實際的來定義他的具體功能。

typedef實際名稱叫函數簽名,不好理解的話你可以將其理解成只有一個方法的接口。

void main() {fun1 f1 = (int a) {print("我是f1,a=" + a.toString());};// 編譯過不去,因為fun1是一個只有一個入參的方法
/*  fun1 f2 = (int a, int b) {print("我是f2");};*/
}
typedef fun1(int a);typedef fun2(int a, int b);

有了這個typedef后,你在定義函數入參的時候就能更精確入參的類型了。

void main() {fun1 f1 = (int a) {print("我是f1,a=" + a.toString());};test(f1);
}typedef fun1(int a);void test(fun1 f1) {f1(555);
}

4. Dart面向對象

Dart的類的定義模式和Java基本一樣。

4.1 構造函數

首先,Dart為了方便使用Java的程序員使用Dart語法,所以他支持Java的同款構造函數,只是不支持重載構造函數。

void main() {// 三種構造函數都能用var userInfo1 = UserInfo1.con2();userInfo1 = UserInfo1("aa");userInfo1 = UserInfo1.con1("aaa", "11", "id");
}// 支持java的構造方法形式
class UserInfo {late String name;String? age;String id = "";UserInfo(String name, String age) {this.age = age;this.name = name;}
}

對于Dart語言本身,他的構造方法有個更簡單的寫法
與此同時,為了彌補不能重載構造函數的問題,Dart語言引入了建造者模式的設計模式,允許通過重命名的方式來設置多個構造函數。

//Dart自己的構造方法形式
class UserInfo1 {late String name;String? age;String id;// 構造函數直接填入成員變量,不需要再寫賦值,是語法糖UserInfo1(this.name, {this.age, this.id = ""}); UserInfo1.con1(this.name, this.age, this.id); //命名為con1的另一個構造方法UserInfo1.con2() : name = "1", age = "2", id = "3"; // 重命名,但是擁有默認實現
}

4.2 訪問權限

Dart中沒有public potect和private關鍵字,而是通過在成員變量前面增加_來標記他為私有成員變量,

注意,Dart的私有成員變量指的是本文件以外的對象無法訪問,和Java中的本對象以外的對象無法訪問不完全相同。

與此同時,對于私有成員變量他的set和get方法寫法也略微有區別。

class PrivateUserInfo {String? name;String? _age; //私有化,但是dart的私有化是該文件內可以訪問,其他文件不能訪問PrivateUserInfo(this.name, this._age);get getAge {return _age;}set setAge(String age) {this._age = age;}
}

PrivateUserInfo在ClassDemo1.dart,ClassDemo2就無法訪問了。
在這里插入圖片描述
私有類也是同理,在類名前面加上下劃線,這里不寫案例。

4.3 類的繼承

和Java同款,唯一區別是,dart語言中沒有interface關鍵字,對于類來說,無論是extends還是implementation,他所繼承的都是類。

class c1 {String? str1;void fun1() {}
}abstract class c2 {String? str2;void fun2();
}class c3 extends c2 implements c1 {String? str1; // 因為implementation,必須加上c1的成員變量void fun1() { // 因為implementation,必須加上c1的方法}void fun2() { // 因為c2的fun2是抽象方法,必須進行實現}
}

參考資料

https://blog.csdn.net/haodawang/article/details/83031378

附錄

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21698.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21698.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21698.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go 語言的控制結構:條件與循環

Go 語言提供了豐富的控制結構,使得開發者可以編寫出具有復雜邏輯的程序。這些控制結構包括用于條件分支的 if-else 和 switch 語句,循環控制的 for 語句,以及用于控制循環執行流的 break 和 continue 關鍵字。此外,Go 語言還支持 …

約瑟夫游戲(編號+密碼)

編號為1、2、3、...、N的N個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。從指定編號為1的人開始,他的密碼為M的初始值,按順時針方向從1號自己開始順序報數,報到指定數M時停止報數,報M的人…

i18n-demo

一、demo 1、資源文件準備 resources下放各個語言文件,直接放resources下都行。我新建一個文件夾,

房地產vr全景展示交互視頻讓購房者更有參與感

在當今房地產市場中,購房者的需求日益多樣化和個性化。為滿足這一趨勢,我們創新性地將VR虛擬現實技術應用于樓盤宣傳,為購房者帶來前所未有的沉浸式購房體驗。 一、地理位置全景展示 通過實景拍攝與VR技術的結合,我們為購房者呈現…

day26-單元測試

1. 單元測試Junit 1.1 什么是單元測試?(掌握) 1.2 Junit的特點?(掌握) 1.3 基本用法:(掌握) 實際開發中單元測試的使用方式(掌握) public class …

C語言,排序

前言 排序,可以說是數據結構中必不可缺的一環。我們創造數據存儲它,要想知道數據之間的聯系,比較是必不可少的。不然,費勁心思得來的數據若是不能有更多的意義,那么拿到了又有什么用? 排序是計算機內經常進…

風險投資公司正在幫助小投資者購買Anthropic、OpenAI等熱門公司的股票

近年來,風險投資公司對于人工智能(AI)領域的公司,如Anthropic、Groq、OpenAI等,表現出了極高的投資熱情。這些公司因為它們在AI技術方面的創新而備受矚目。但是,對于很多小投資者來說,由于資金有…

[C#]使用C#部署yolov8的目標檢測tensorrt模型

【測試通過環境】 win10 x64 vs2019 cuda11.7cudnn8.8.0 TensorRT-8.6.1.6 opencvsharp4.9.0 .NET Framework4.7.2 NVIDIA GeForce RTX 2070 Super 版本和上述環境版本不一樣的需要重新編譯TensorRtExtern.dll,TensorRtExtern源碼地址:TensorRT-CShar…

期權的權利金怎么算的

期權權利金的計算涉及多個因素,包括敲定價格、到期時間以及整個期權合約的具體情況。期權的權利金具體的計算公式和因素可能因不同的期權合約和市場條件而有所不同,下文為大家介紹期權的權利金怎么算的 ?本文來自:期權醬 一、期權…

【LeetCode】二叉樹oj專題

如有不懂的地方,可查閱往期相關文章! 個人主頁:小八哥向前沖~ 所屬專欄:數據結構【c語言】 目錄 單值二叉樹 對稱二叉樹 計算二叉樹的深度 二叉樹的前序遍歷 相同二叉樹 另一棵樹的子樹 二叉樹的構建和遍歷 翻轉二叉樹 判…

spring boot 中的異步@Async

spring boot 開啟異步調用 1、啟動類上添加EnableAsync注解,表示啟動異步 2、在具體實現異步的方法上添加Async注解 package com.example.demo;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootAppli…

YOLOv3+mAP實現金魚檢測

YOLOv3mAP實現金魚檢測 Git源碼地址:傳送門 準備數據集 按幀數讀取視頻保存圖片 video2frame.py使用labelimg標注工具對圖片進行標注統一圖片大小為 416x416,并把標簽等信息寫成.xml文件 conver_point.py讀取縮放后的標簽圖片,轉為左上角右下…

如何快速部署上線項目

CSDN 的小伙伴們,大家好呀,我是蒼何。 今天在群里面看到有小伙伴反饋說,面試的時候一被問到簡歷中的項目還沒上線,就不繼續問了,感覺挺奇葩的,要知道就校招來說,項目本身大部分都是練手的項目&…

Linux基礎1-基本指令3

上篇文章我們說到了文件,pwd,touch,mkdir等知識。 Linux基礎1-基本指令2(你真的了解文件嗎?)-CSDN博客 本文繼續梳理其他基礎命令 1.本章重點 1.刪除一個空目錄命令rmdir 2.刪除一個文件指令rm(重要!) 3.man命令&am…

Lf工作流自定義html節點

1.定義js文件CustomCircle.js import { HtmlNode, HtmlNodeModel } from "logicflow/core"; class UmlModel extends HtmlNodeModel {setAttributes() {this.text.editable false; // 禁止節點文本編輯// 設置節點寬高和錨點const width 120;const height 70;thi…

做視頻號小店保證金要交多少?保證金提現條件是什么?

大家好,我是噴火龍。 做視頻號小店也是需要繳納保證金的,保證金分為類目保證金和浮動保證金。 先來說說類目保證金,類目保證金由視頻號小店主體資質類型和經營商品類目決定。 類目保證金有以下三點需要注意: 1. 如果你要申請新…

CentOS 7~9 救援模式恢復root密碼實戰指南

在管理Linux服務器時,忘記root密碼是一件棘手的事情,但幸運的是,CentOS提供了救援模式來幫助我們重置root密碼。本文將詳細介紹如何通過GRUB引導菜單進入緊急模式(或稱為救援模式),進而恢復root用戶的密碼。…

Python量化交易學習——Part4:基于基本面的單因子選股策略

技術分析與基本面分析是股票價格分析最基礎也是最經典的兩個部分。技術分析是針對交易曲線及成交量等指標進行分析,基本面分析是基于公司的基本素質進行分析。 一般來說選股要先選行業,在選個股,之后根據技術分析選擇買賣節點,因此針對行業及個股的基本面分析是選股的基礎。…

【ARMv7-A】——WFE(wait for event)

文章目錄 WFE基本概念工作原理事件類型使用場景WFIWFEWFE 和 WFI 相同點WFE 和 WFI 不同點觸發條件事件標志影響多核系統中的應用使用場景:代碼實例linux 內核中的 WFI 指令WFE WFE 即 Wait for ev

# 全面解剖 消息中間件 RocketMQ-(4)

全面解剖 消息中間件 RocketMQ-(4) 一、RocketMQ 順序消息分析 1、消息有序:指的是可以按照消息的發送順序來消費(FIFO)。RocketMQ 可以嚴格的保證消息有序,可以分為分區有序或者全局有序。 2、順序消費的原理解析 在默認的情…