Dart語言詳解(二)——基本語法

想學Flutter,就請關注這個專欄
Flutter系列(一)——詳細介紹
Flutter系列(二)——與React Native進行對比
Flutter系列(三)——環境搭建(Windows)
Flutter系列(四)——HelloWorld
Dart語言詳解(一)——詳細介紹
Dart語言詳解(二)——基本語法

文檔歸檔:
https://github.com/yang0range/flutterfilejava

前言

以前,詳細的介紹了一下Dart語言的前世此生,接下來,咱們就該深刻的瞭解Dart語言,瞭解Dart語言的基本數據類型,語法等相關的內容git

變量和數據類型

變量

命名

在Dart語言當中,定義變量的方式是github

dataType viriableName = Initial Valute

這裏其實和Java是同樣的,不只如此連命名的方式也和Java相同,都是採用駝峯命名的方式。閉包

聲明

在聲明的時候,除了基本數據類型以外,還有三種變量的聲明。app

var,dynamic,Objectide

var:若是沒有初始值的時候,var能夠變成任意類型。 函數

dynamic:動態任意類型,編譯階段不檢查類型。 學習

Object: 動態任意類型,在編譯階段檢查類型。ui

和var的區別:
var若是有初始值,那麼類型會被鎖定。編碼

變量的默認值

1.沒有初始值的變量會自動獲取一個默認值null
2.一切皆爲對象,對象的默認值是null

final和const

表示不可改變
相同點:

  • 聲明的類型能夠省略
  • 初始化後不能再賦值
  • 不能和var同時使用

不一樣點:

  • 類級別常量,使用static const
  • const可以使用其餘const 常量的值來初始化其值
  • 使用const賦值聲明,const能夠省略
  • 能夠更改非final、非const變量的值。即便曾經具備const值
  • const致使的不可變性是能夠傳遞的
  • 相同的const常量不會再內存中重複建立
  • const須要是編譯時常量

基本數據類型

Dart總共又8種基本數據類型。
分別是:
image.png

Numbers 數值型

數值型裏面有包含了int型和doubule兩種類型,這兩種和Java相似,其中int是整數型,double是64-bit雙精度浮點數,這兩種都是Numbers類型的子類。

String

Dart字符串是UTF-16編碼的字符序列。

1.可使用單引號或者雙引號來建立字符
例如:

void main() {
  print("This is a String");
  print('This is also a stirng');
}

這兩個是同樣的。

2.字符串拼接
例如:

void main() {
  String s1 = "First string.";
  String s2 = "Second string";
  print(s1 + s2);
}

3.字符插值
${exprsssion},若是表達式是一個標識符,能夠省略{},若是表達式的結果爲一個對象,Dart會調用對象的toString()函數來獲取一個字符串。
例如:

void main() {
  String s1 = "First string.";
  print("String $s1");
}
void main() {
  print("The sum of 1 and 1 equals ${1 + 1}.");
}

4.多行顯示
使用雙引號建立多行字符
還可使用(')和(")
例如:

var s = 'Firtst'
  'Second'
  "Third";
   print(s);

使用三引表示多行字符
例如

var multilineString = """This is a
   multiline string
   consistiong of
   multiple lines""";
  print(multilineString);

5.使用r前綴建立「原始raw」字符串

String s4 ="adbchi\ndfafa";
  print(s4);

  String s5 =r"adbchi\ndfafa";
  print(s5);

輸出的結果

I/flutter (17682): adbchi
I/flutter (17682): dfafa
I/flutter (17682): adbchi\ndfafa
Bool

Dart的bool和Java相似只有兩種類型,一種是true一種是false,可是,不一樣的是bool對象未初始化的默認值是null。

List
  • 由於在Dart當中,由一切皆爲對象的概念,Dart就能夠直接打印list包含list的元素,這點和Java由明顯的不一樣,java中直接打印list結果是地址值。

例如

var list = [0, 1, 2, 3, 4, 5, 6];
  print(list);

打印出結果

I/flutter (24300): [0, 1, 2, 3, 4, 5, 6]
  • Dart中List的下標索引和java同樣都是從0開始。
  • Dart中List也支持泛型,這點和java同樣,同時還能夠進行泛型的判斷。

    var list1 = List<String>();
     print(list1 is List<String>);
     輸出:
     true
- 有增刪改查的操做,支持倒敘,自帶順序,洗牌,可使用+將兩個List合併。  
例如

var list = [0, 1, 2, 3, 4, 5, 6];
print(list);
var list2 = [7,8,9,10,11];

print(list+list2);
輸出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

##### Set
Dart裏面的Set和Java相似,也是不能存放重複的元素。
- 兩種初始化方式  
  Set有兩種初始化方式

var setName = <dataType>{}
Set<dataType> setName ={}

-   大部分操做是和Java相似的  
**不一樣的地方:**
-   difference:返回set1集合裏面有可是set2裏面沒有的元素集合

Set<String> set1 = {"1","2","3","4","5"};
Set<String> set2 = {"1","2","3"};
print(set1.difference(set2));
輸出:
{4, 5}

-  intersection:返回set1和set2的交集

Set<String> set1 = {"1","2","3","4","5"};
Set<String> set2 = {"1","2","3"};
print(set1.intersection(set2));
輸出:
{1, 2, 3}

-  union:返回set1和set2的並集

Set<String> set1 = {"1","2","3","4","5"};
Set<String> set2 = {"1","2","3"};
print(set1.union(set2));
輸出:
{1, 2, 3, 4, 5}

-  retainAll:set1只保留某些元素(要保留的元素要在原set中存在)  
##### Map
和Java相似

##### Runes
Runes再Dart當中是字符的UTF-32的編碼

Main(){
Runes runes = new Runes('u{1f605} u6211‘);
var str1 = String.fromCharCodes(runes);
print(str1);
}

##### Symbol
Symbol標識符,主要是反射的做用,如今再mirrors模塊已經被移除了。

### 函數
#### 定義
整體來講,和java相似。  
其餘幾個特單:
- 可在函數內定義
- 定義函數時能夠省略類型
- 支持縮寫語法=>

int add(int a, int b) => a + b;

#### 可選參數
- 能夠選擇命名參數
- 能夠選擇位置參數
- 能夠添加默認參數

printer(num n,{String s1, String s2}) { 
  print(n); 
  print(s1); 
  print(s2);
}

main() {
  printer(75, s1: 'hello');
}

printer(num n,{String s1, String s2}) { 
  print(n); 
  print(s1); 
  print(s2);
}

main() {
  printer(75);
}

printer(num n,{String s1, String s2}) { 
  print(n); 
  print(s1); 
  print(s2);
}

main() {
  printer(75, s1: 'hello', s2: 'there');
}

String mysteryMessage(String who, [String what, String where]){
  var message = '$who';
  if(what != null && where == null){
    message = '$message said $what';
  } else if (where != null){
    message = '$message said $what at $where';
  }
  return message;
}

main() {
  var result = mysteryMessage('Billy', 'howdy', 'the ranch');
  print(result);
}

#### 匿名函數
- 能夠賦值給變量,經過變量調用
- 能夠在其餘函數當中直接調用或者傳遞給其餘函數

//匿名函數
//賦值給變量
//無參匿名函數
var anonFunc1 = () => print('無參匿名函數');
anonFunc1();

//有參匿名函數
var anonFunc = (name) => 'I am $name';
print(anonFunc('damon'));

//經過()調用,不推薦
// (()=>print('不推薦'))();

//匿名函數傳參
List test(List list, String func(str)) {

for (var i = 0; i < list.length; i++) {
  list[i] = func(list[i]);
}
return list;

}

var list = ['d', 'a', 'm', 'o', 'n'];
print(test(list, (str) => str 2)); //String int, Dart和Python能夠這樣用

//List.forEach()就用的匿名函數
List list1 = [11, 12, 13];
list1.forEach((item) => print('$item'));

//返回Function對象(閉包)
Function makeAddFunc(int x) {

x++;
return (int y) => x + y;

}

var addFunc = makeAddFunc(2);
print(addFunc(3));

// 函數別名
MyFunc myFunc;
//能夠指向任何同簽名的函數
myFunc = subtsract;
myFunc(4, 2);
myFunc = divide;
myFunc(4, 2);
//typedef 做爲參數傳遞給函數
calculator(4, 2, subtsract);
}

//函數別名
typedef MyFunc(int a, int b);
//根據MyFunc相同的函數簽名定義兩個函數
subtsract(int a, int b) {
print('subtsract: ${a - b}');
}

divide(int a, int b) {
print('divide: ${a / b}');
}
//typedef 也能夠做爲參數傳遞給函數
calculator(int a, int b, MyFunc func) {
func(a, b);
}

### 邏輯運算
#### 操做符
操做符大部分也和Java相同。
![image.png](https://upload-images.jianshu.io/upload_images/3258163-b89121a9a690e641.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

標紅的是不一樣的,下面着重介紹一下。
##### ?.
  條件成員訪問 和 . 相似,可是左邊的操做對象不能爲 null,例如 foo?.bar 若是 foo 爲 null 則返回 null,不然返回 bar 成員。

String a;
print(a?.length);
輸出null

String a="aaa";
print(a?.length);
輸出 3

#####  ~/ 
取商操做符   
被除數 ÷ 除數 = 商 ... 餘數,A ~/ B = C,這個C就是商。至關於Java裏的 /

#####   :as、is、is!
類型斷定操做  
類型斷定操做符:as、is、is!在運行時斷定對象類型

//as 類型轉換
num iNum = 1;
num dNum = 1.0;
int i = iNum as int;
double d = dNum as double;
print([i, d]);

// String s = iNum as String;

//is 若是對象是指定的類型返回 True
print(iNum is int);
Child child;
Child child1 = new Child();
print(child is Parent); //child is Null
print(child1 is Parent);

//is! 若是對象是指定的類型返回 False
print(iNum is! int);

##### ..
級聯操做符  
連續調用多個函數以及訪問成員變量。  
兩個點的級聯語法不是一個操做符。 只是一個 Dart 特殊語法。

StringBuffer sb = new StringBuffer();
sb

..write('dongnao')
..write('flutter')
..write('\n')
..writeln('damon');
#### 流程控制語句
- if else
- for,forEach,for-in
- while,do-while
- break,continue
- switch case
- assert   
大部分使用方法都是和Java相同的。  
不一樣的有
##### for-in

var colorList = ['black','red','yellow'];
for(var i in colorList){

print(i);

}
輸出:
I/flutter (31601): black
I/flutter (31601): red
I/flutter (31601): yellow

##### assert  
斷言,它能夠爲代碼執行設置條件,用於bool條件爲false時中斷正常的運行。  
assert(condition,optional,message)

var variable;
print(variable);
assert(variable!=null);
variable = 6;
print(variable);
輸出:
[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: 'package:flutter_app/main.dart': Failed assertion: line 50 pos 10: 'variable!=null': is not true.

## 最後
這一篇文章,咱們詳細的介紹了一下Dart語言的基本語法,瞭解Java的同窗,對這些應該不陌生。接下來一篇文章,會對Dart語言繼續進行詳細介紹,讓你們對Dart有一個高階,全面的認識。

​**Flutter**已是**Top20**的軟件庫,經過接下來的一系列的文章,但願我和你們一塊兒來學習**Flutter**,一塊兒進步,一塊兒有所收穫,掌握將來技術主流的主動權!

有什麼好的建議,意見,想法歡迎給我留言!

### 歡迎關注公共號
#### 關注公衆號會有更多收穫!
![image.png](https://upload-images.jianshu.io/upload_images/3258163-82c59daaf3da2cb6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![](https://upload-images.jianshu.io/upload_images/3258163-635809c97c6586e8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
相關文章
相關標籤/搜索