天天看點

2021超詳細的Dart語言基礎總結~你值得擁有~

2021超詳細的Dart語言基礎總結~你值得擁有~

文章目錄

  • ​​前言:dart語言簡介​​
  • ​​一、變量​​
  • ​​1.1.類型推導​​
  • ​​1.2.預設值​​
  • ​​1.3.Final 和 const修飾符​​
  • ​​二、内建類型​​
  • ​​2.1.資料類型​​
  • ​​2.2.集合的相關操作​​
  • ​​三、函數​​
  • ​​3.1.函數的定義​​
  • ​​3.2.箭頭函數​​
  • ​​3.3.可選函數​​
  • ​​3.4.參數預設值​​
  • ​​3.5.匿名函數​​
  • ​​3.6.詞法作用域​​
  • ​​3.7.詞法閉包​​
  • ​​3.7.傳回值問題​​
  • ​​四、運算符​​
  • ​​4.1.除法、整除、取模運算​​
  • ​​4.2.條件運算符​​
  • ​​4.3.級聯文法​​
  • ​​五、循環語句​​
  • ​​六、類和對象​​
  • ​​6.1.類型的定義​​
  • ​​6.2.不支援重載​​
  • ​​6.3.抽象類​​
  • ​​6.4.繼承​​
  • ​​6.5.隐式接口​​
  • ​​6.6.Mixin混入​​
  • ​​七、泛型​​
  • ​​7.1.List泛型​​
  • ​​7.2.Map泛型​​
  • ​​7.3.泛型方法​​
  • ​​八、異步​​
  • ​​九、中繼資料​​

前言:dart語言簡介

Dart是谷歌開發的計算機程式設計語言,後來被Ecma認定為标準 。它被用于web、伺服器、移動應用 和物聯網等領域的開發。它是寬松開源許可證下的開源軟體。

Dart是面向對象的、類定義的、單繼承的語言。它的文法類似C語言,可以轉譯為JavaScript,支援接口、混入、抽象類、具體化泛型、可選類型和sound type system 。

一、變量

1.1.類型推導

建立一個變量并初始化

var name = ‘Bob’;

動态類型(會關閉類型檢查)

dynamic name = ’ Bob’;
void main() {
  dynamic name = 'Ronin';
  print(name.runtimeType);
  var name2 = 'Ronin';
  print(name2.runtimeType);
  name = 12;
  print(name.runtimeType);
}      
2021超詳細的Dart語言基礎總結~你值得擁有~

1.2.預設值

var s; //預設為null

print(s);

2021超詳細的Dart語言基礎總結~你值得擁有~

1.3.Final 和 const修飾符

如果你從未打算改變一個變量,那麼可以使用final和const修飾它

final name = 'zsh';
name = 'zms'; // 錯誤做法

const age = 20;
age = 19; // 錯誤做法      

final和const的差別?

const在指派時, 指派的内容必須是在編譯期間就确定下來的

final在指派時, 可以動态擷取, 比如指派一個函數

getName() {
    return "zsh";
  }
  main() {
    final name1 = getName(); //正确
    const name2 = getName();  //錯誤->需要執行函數才能取到值
  }      

二、内建類型

2.1.資料類型

整數類型 int a = 1;

浮點類型 double = 1.23;

字元串類型 String s = ‘abc’;

布爾類型 bool flag = true;

List集合類型 List list = [‘a’,‘b’,‘c’,‘d’];

字典(Map)類型 Map<String,String> map2 = {‘name’:‘zsh’,‘age’:‘20’};

main() {
  int a = 1;  //整數類型
  print(a);

  double b = 1.23; //浮點類型
  print(b);

  String s = 'abc'; //字元串類型
  print('$s');

  bool flag = true;   //布爾類型
  print(flag);

  var str1 = ['a','b','c','d'];   //List集合類型,使用類型推導定義
  print('$str1 ${str1.runtimeType}');

  List<String> list = ['a','b','c','d'];  //List定義
  print('$list ${list.runtimeType}');

  var map1 = {'name':'zsh','age':'20'};   //字典類型,使用類型推導定義
  print('$map1 ${map1.runtimeType}');

  Map<String,String> map2 = {'name':'zsh','age':'20'};
  print('$map2 ${map2.runtimeType}');
}      
2021超詳細的Dart語言基礎總結~你值得擁有~

2.2.集合的相關操作

2.2.1、是以集合都支援length屬性
main() {
  //1.length屬性
  List<String> list = ['a','b','c','d'];
  Map<String,String> map = {'name':'zsh','age':'20'};
  print('${list.length}');
  print('${map.length}');
}      
2021超詳細的Dart語言基礎總結~你值得擁有~
2.2.2、添加,删除,包含操作
main() {
  //1.length屬性
  List<String> list = ['a','b','c','d'];
  Map<String,String> map = {'name':'zsh','age':'20'};
 
  //list
  list.add('e');    //添加
  print('$list');
  
  list.remove('a');    //删除
  print('$list');
  
  bool s = list.contains('b');  //是否包含
  print('$s');
  /**
   * ------------------------------------------------
   */
  //map
  Map<String,String> map2 = {'height':'10','weight':'20'};
  map.addAll(map2);      //添加一個map集合
  print('$map');
  
  map.remove('name');    //删除
  print('$map');

  print('${map.containsKey('age')}');  //包含
}      

三、函數

3.1.函數的定義

傳回值 函數的名稱(參數清單) {

函數體

return 傳回值

}

String getString() {
  return "zsh";
}
void main() {
  String s = getString();
  print('$s');
}      

3.2.箭頭函數

void main() {
  List<String> list = ['a','b','c','d'];
  list.forEach((value)=> print('$value'));
}      

3.3.可選函數

void copy(String name,{int age,int num }) {
  print('$name $age $num');
}
main() {
  copy('zsh');
  copy('zsh',age:20);
  copy('zsh',age: 20,num: 10);
}      
2021超詳細的Dart語言基礎總結~你值得擁有~

3.4.參數預設值

參數可以有預設值, 在不傳入的情況下, 使用預設值

隻有可選參數才可以有預設值

copy(String name, {int age = 20, double height=1.3}) {
  print('name=$name age=$age height=$height');
}      

3.5.匿名函數

(functio(){
  ```
})()      

3.6.詞法作用域

dart中的詞法有自己明确的作用域範圍,它是根據代碼的結構({})來決定作用域範圍的

優先使用自己作用域中的變量,如果沒有找到,則一層層向外查找。

var s = 'zsh';
main() {
  font() {
    print('$s');
  }
  font();
}      

3.7.詞法閉包

閉包可以通路其詞法範圍内的變量,即使函數在其他地方被使用,也可以正常的通路。
main() {
 makeAdder(num addBy) {
   return (num i) {
     return i + addBy;
   };
 }

 var adder2 = makeAdder(2);
 print(adder2(10)); // 12
 print(adder2(6)); // 8

 var adder5 = makeAdder(5);
 print(adder5(10)); // 15
 print(adder5(6)); // 11
}      

3.7.傳回值問題

所有函數都傳回一個值。如果沒有指定傳回值,則語句傳回null;隐式附加到函數體。
main(List<String> args) {
  print(foo()); // null
}

foo() {
}      

四、運算符

4.1.除法、整除、取模運算

var num = 7;
print(num / 3); // 除法操作, 結果2.3333..
print(num ~/ 3); // 整除操作, 結果2;
print(num % 3); // 取模操作, 結果1;      

4.2.條件運算符

Dart中包含一直比較特殊的條件運算符:expr1 ?? expr2

如果expr1是null,則傳回expr2的結果;

如果expr1不是null,直接使用expr1的結果。

var str = 'zsh';
var str= null;
var str= str ?? 'kobe';
print(str);      

4.3.級聯文法

對一個對象進行連續的操作,這個時候可以使用級聯文法
class Shop{
  String name;

  void add() {
    print("${name} is add");
  }

  void update() {
    print("${name} is update");
  }

}

main(List<String> args) {
  final p1 = Shop();
  p1.name = 'zsh';
  p1.add();
  p1.update();

  final p2 = Shop()
              ..name = "zsh"
              ..add()
              ..update()
}      

五、循環語句

if 和 else

for循環

while和do-while循環

break和continue

switch和case

六、類和對象

6.1.類型的定義

class 類名 {

類型 成員名;

傳回值類型 方法名(參數清單) {

方法體

}

}

class Csrf{
  String name;

  test() {
    print('${name}');
  }
}      

6.2.不支援重載

Dart本身不支援函數的重載

class Csrf{
  String name;
  int age;

  Csrf(String name, int age) {
    this.name = name;
    this.age = age;
  }
}      

6.3.抽象類

抽象方法,必須存在于抽象類中。

抽象類是使用abstract聲明的類。

abstract class AbstractContainer {
  void updateChildren();      

6.4.繼承

Dart中的繼承使用extends關鍵字,子類中使用super來通路父類。

父類中的所有成員變量和方法都會被繼承,,但是構造方法除外。

class Animal {
  String name;
}
class Cat extends Animal {

}      

6.5.隐式接口

預設情況下,定義的每個類都相當于預設也聲明了一個接口,可以由其他的類來實作(因為Dart不支援多繼承)
abstract class Dog{
  method1();
}

abstract class Cat{
  method2();
}

class Person implements Dog, Cat{
  @override
  method1() {
   
  }

  @override
  method2() {
 
  }
}      

6.6.Mixin混入

Mixin混入的方式實作多繼承
mixin Cat{
  method1() {
 
  }
}
mixin Dog{
  method2() {
  
  }
}
class Person implements Cat, Dog{
}      

七、泛型

7.1.List泛型

List list = [‘zsh’, ‘zms’, ‘user’];

var list = [‘zsh’, ‘zms’, ‘user’];

7.2.Map泛型

Map<String, String> map= {‘name’: ‘zsh’, ‘age’: ‘20’};

var map2 = <String, String>{‘name’: ‘zsh’, ‘age’: ‘20’};

7.3.泛型方法

T first(List ts) {

T tmp = ts[0];

return tmp;

}

main() {
  var names = ['zsh', 'ss'];
  var first = getFirst(names);
  print('$first ${first.runtimeType}');//zsh String
}

T getFirst<T>(List<T> ts) {
  return ts[0];
}      

八、異步

Dart是單線程模型

九、中繼資料

class Todo {
  final String who;
  final String what;

  Todo(this.who, this.what);
}      
import 'todo.dart';

@Todo('seth', 'make this do something')
void doSomething() {
  print('do something');
}