想學習Flutter開發,那就必須學習Dart編程語言的語法,下面我們就通過一篇文章去了解一下Dart語言的魅力吧!
數據類型
1、變量
Dart中有 var、dynamic、bool、int、double、String、List、Map、enum等數據類型。
(1) var 可以聲明任何類型的數據類型,數據類型取決於變量的值。
var name = 'Bob';
(2) 未指定靜態類型的變量則會隱式聲明為 dynamic,也可以使用dynamic關鍵字代替var關鍵字聲明變量。
dynamic name = 'Bob';
(3) bool 布爾類型,true和false。
(4) int 整型
(5) double 雙精度型,小數都用這個。
(6) String 字符串類型
(7) List 列表類型,大概就這個樣子 ⬇️
var lists = [1,2,3,4,5,6];
(8) Map 映射類型,也就是鍵值對。
var maps = {'username':'zhangsan','password':'admin12345'};
(9) enum 枚舉類型
// 聲明枚舉
enum Status{
success,
error
}
void main(List<string> args) {
// 打印枚舉值
print(Status.success);
print(Status.error);
print(Status.values); // 打印結果: [Status.success, Status.error]
// 遍歷枚舉
Status.values.forEach((v){
print(v);
});
}/<string>
2、常量
final 和 const
final和const關鍵字用於聲明常量。在Dart中不能修改使用final或const關鍵字聲明變量的值。這些關鍵字可以與變量的數據類型一起使用,也可以與var關鍵字一起使用。
const關鍵字用於表示編譯時常量。使用const關鍵字聲明的變量是隱式final。
示例:
final name = 'zhangSan';
final String name = 'zhangSan';
const name = 'liSi';
const String name = 'liSi';
// 我們都是常量!
運算符
這些大家可以再本地多試一試!
條件語句
(1) if 語句
var num = 10;
if (num > 20) {
print('num > 20');
}
(2) if...else...語句
var num = 10;
if (num > 20) {
print('num > 20');
}else{
print('num <= 20');
}
(3) switch...case... 語句
var num = 30;
switch (num) {
case 10:{
print('num == 10');
}
break;
case 20:{
print('num == 20');
}
break;
default:{
print('num != 10 && num != 20');
}
}
這個和大家平時接觸的應該都差不多!
循環語句
(1) for循環語句
var num = 30;
for (var i = 0; i < num; i++) {
print('num:'+i.toString());
}
(2) for…in...循環
var lists = [1,2,3,4,5,6,7,8];
for (var i in lists) {
print(i);
}
(3) while循環
var b = true;
int i = 0;
\t// 當 b == false 時, while 循環停止執行
while (b) {
i++;
if (i == 15) {
b = false;
}
print(i);
}
(4) do…while循環
do {
print('執行了!');
} while (false);
// 循環體至少執行一次!
(5) break 語句 : 跳出循環
int i = 0;
\t// 當 b == false 時, while 循環停止執行
while (true) {
i++;
if (i == 15) {
break;
}
print(i);
}
(6) continue語句 : 跳出當前循環,執行下一次循環
var lists = [1,2,3,4,5,6,7,8];
for (var i in lists) {
if(i == 5){
\t// 跳過當前循環,執行下一次循環
continue;
}
print(i);
}
// 打印結果: 1 2 3 4 6 7 8 只有 5沒有打印輸出
(7) 使用標籤來控制循環
標籤只是一個標識符,後跟冒號(:)應用於語句或代碼塊。標籤可以與斷點一起使用,並繼續更精確地控制流程。
- 帶有break的標籤
for (var i = 0; i < 4; i++) {
a:
for (var j = 0; j < 5; j++) {
if (j>3) {
break;
}
// 當 i==2 時,執行break語句
if (i == 2) {
break a; // 當這句代碼執行時,會中斷 標籤a:下面的循環
}
print('i:'+i.toString()+'==='+'j:'+j.toString());
}
}
- 帶有continue的標籤
for (var i = 0; i < 4; i++) {
a:
for (var j = 0; j < 5; j++) {
if (j>3) {
break;
}
// 當 i==2 時,執行continue語句
if (i == 2) {
continue a;
}
print('i:'+i.toString()+'==='+'j:'+j.toString());
}
}
函數、接口、類、對象
一、函數
函數是一組用於執行特定任務的語句。函數將程序組織成邏輯代碼塊。
return_type(返回類型) function_name(函數名)(type value){
\t\t// 執行代碼
}
函數的類型:
(1) 有參數的和無參數的
// 有參數的
int sum(int x,int y){
\treturn x+y;
}
// 無參數的
int sum(){
\treturn 110;
}
(2) 有返回值和無返回值的
// 有返回值的
int sum(int x,int y){
\treturn x+y;
}
// 無返回值的
void sum(){
\t
}
(3) 可選位置參數
要指定可選的位置參數,請使用方括號[]。
void main(List<string> args) {
// 調用函數
print(sum(13, 25));
print(sum(13, 25,23));
}
// 方法一:可選參數默認為 null
int sum(int i,int j,[int z]){
\t// 判斷可選參數是否為空,為空就賦初值
if(z.toString() == "null"){
z = 0;
}
return i + j + z;
}
// 方法二:可選參數可以賦初值
int sum(int i,int j,[int z = 0]){
return i + j + z;
}/<string>
(4) 可選的命名參數
與位置參數不同,必須在傳遞值時指定參數名稱。花括號{}可用於指定可選的命名參數。
void main(List<string> args) {
// 調用函數
print(sum(13, 25));
print(sum(13, 25,x:23,y:20));
}
int sum(int i,int j,{x=0,y=0}){
return i + j + x+y;
}
// 打印結果: 38 81/<string>
二、接口
接口定義任何實體必須遵守的語法。接口定義了一組對象可用的方法。
(1) 類通過 implements 關鍵字來實現接口
(2) 類可以實現多個接口
void main() {
Calculator c = new Calculator();
print("The gross total : ${c.ret_tot()}");
print("Discount :${c.ret_dis()}");
}
// 接口1
class Calculate_Total {
int ret_tot() {}
}
// 接口2
class Calculate_Discount {
int ret_dis() {}
}
// 類實現多個接口
class Calculator implements Calculate_Total,Calculate_Discount {
// 實現接口1中的函數
int ret_tot() {
return 1000;
}
// 實現接口2中的函數
int ret_dis() {
return 50;
}
}
三、類
使用class關鍵字在Dart中聲明一個類。類定義以關鍵字class開頭,後跟類名; 並且由一對花括號包圍的類體。
類體中有:
(1) fields
(2) getter和setter方法
(3) constructors
(4) functions
示例:
void main(List<string> args) {
// 根據命名構造函數初始化對象實例
var stu = new Student.name('Bob');
print(stu.name);
}
class Student{
String name;
// getter 方法
String get stu_name{
\treturn name;
}
\t// setter 方法
\tvoid set stu_name(String _name){
\tthis.name = _name;
}
// 默認構成函數
Student(){}
// 命名構造函數
Student.name(String _name){
this.name = _name;
}
// 普通方法
\tvoid read(){
\t
}
}/<string>
(5) super 和 this 關鍵字
super關鍵字用於引用類的直接父級。supper關鍵字可用於引用超類的變量,屬性或方法等等。
this關鍵字引用類的當前實例。這裡,參數名稱和類字段的名稱是相同的。
(6) static 關鍵字
static關鍵字可以應用於類的數據成員,即字段和方法。靜態變量保留其值,直到程序完成執行。
(7) 類的繼承
- 單層 : 每個類最多可以從一個父類擴展
- 多層 : 一個類可以從多個類繼承,Dart不支持多重繼承。
- 多級 : 類可以從另一個子類繼承。
(8) 方法的重寫
方法重寫是子類在其父類中重新定義方法的機制。
四、對象
(1) 級聯運算符(..)
級聯(..)運算符可用於通過對象發出一系列調用。
void main(List<string> args) {
// 使用級聯運算符來訪問方法
new Student()..test_method()..test_method1();
}
class Student{
void test_method(){
print('test_mehtod');
}
void test_method1(){
print('test_mehtod1');
}
}
// 打印結果: test_mehtod test_mehtod1/<string>
(2) toString() 方法
此函數返回對象的字符串表示形式。
void main(List<string> args) {
// 使用 toString() 方法
print(new Student()..toString());
}
class Student{
void test_method(){
print('test_mehtod');
}
void test_method1(){
print('test_mehtod1');
}
}/<string>
異常
try/on/catch塊
與我們平常的的異常處理相比,Dart多了on塊,on塊可以指定異常類型。其他的用法與平常使用相似。
int x = 12;
int y = 0;
var res;
// 使用 on 指定異常類型
try{
res = x~/y;
}on IntegerDivisionByZeroException{
print('除數不能為0');
}
在異常中還有 finally 塊(最後都會執行的塊),使用throw關鍵字拋出異常以及自定義異常。
Typedef
typedef或函數類型別名有助於定義指向內存中可執行代碼的指針。簡單地說,typedef可以用作引用函數的指針。
typedef ManyOperation(int fristNo,int secondNo);
Add(int firstNo,int second){
print("Add result is ${firstNo+second}");
}
Subtract(int firstNo,int second){
print("Subtract result is ${firstNo-second}");
}
Divide(int firstNo,int second){
print("Divide result is ${firstNo/second}");
}
Calculator(int a, int b, ManyOperation oper){
print("Inside calculator");
oper(a,b);
}
void main(List<string> args) {
ManyOperation oper = Add;
oper(10,20);
oper = Subtract;
oper(10,20);
oper = Divide;
oper(50,5);
\t// typedef作為參數
\tCalculator(5,5,oper);
}
/*
打印結果:
Add result is 30
Subtract result is -10
Divide result is 10.0
*//<string>
Dart 庫、同步和異步、併發
寫的有點累了! 最後這三個概念其實也不復雜,我就偷個懶吧!
對了! 詳細的Dart基礎知識的文檔,我也放在後臺了,在私信欄回覆 dart 就可以獲取!
閱讀更多 程序猿CoderWu 的文章