Dart基礎知識

這一篇咱們不講Flutter 的知識,來說一講Dart 的基礎知識。php

先來看看維基百科上關於Dart 的簡介:web

Dart(是一種適用於萬維網開放源代碼編程語言,由Google主導開發,於2011年10月公開。它的開發團隊由Google Chrome瀏覽器V8引擎團隊的領導者拉爾斯·巴克主持,目標在於成爲下一代結構化Web開發語言。編程

相似JavaScript,Dart也是一種面向對象語言,可是它採用基於類編程。它只容許單一繼承,語法風格接近C語言json

再打開 Dart 官網:dart.dev,映入眼簾的是:瀏覽器

emmmm….很明顯,如今知道 Dart 語言的人大部分都是由於 Flutter,這與它的目標成爲下一代結構化Web開發語言好像有點誤差。(不過在Flutter 1.5 發佈的時候發佈了 Flutter for web)編程語言

不過無所謂,不管它最開始的目標是什麼,既然咱們如今想要學習 Flutter ,那就要了解 Dart 這門開發語言。ide

話很少說,咱們開始。函數

首先咱們要知道,Dart是一個純面嚮對象語言,也就是說,在Dart中,一切皆對象。學習

Dart代碼長什麼樣子

好像咱們看到的 Dart 代碼都是從 Flutter 裏看見的,一個括號套一個括號,一大堆的括號。測試

那麼標準的 Dart 代碼是什麼樣的:

// 定義個方法。
printNumber(num aNumber) {
  print('The number is $aNumber.'); // 在控制檯打印內容。
}

// 這是程序執行的入口。
main() {
  var number = 42; // 定義並初始化一個變量。
  printNumber(number); // 調用一個方法。
}
複製代碼

好像沒什麼不一樣的,只是有一個 num 好像有點不太同樣(由於我是搞Android的,因此上來就看到了這一個問題)。

那咱們就從變量開始講起。

變量

聲明變量

在 Dart 中,咱們聲明一個變量有兩種方法:

var _str = '';
int _num = 1;
複製代碼

全部用下劃線開頭的 不管是方法 仍是變量 都是私有的。

咱們能夠用var 來聲明一個變量,也能夠指定變量的類型。

那麼咱們何時用什麼樣的方式來聲明變量呢?

能夠經過Dart代碼風格推薦裏來查詢到:

對於局部變量,使用 var 而不是具體的類型來定義局部變量。

對於私有成員變量,推薦使用指定變量的類型來聲明變量。

常量

在 Dart 中,咱們聲明常量有兩種方法:

const String constString = "";
final String _finalString;
複製代碼

一種是用 const,一種是用 final。

兩種有什麼區別?

const

const 是在編譯時期就必須賦值,並且 const 在類中的話,就必須定義爲 static const.

final

final 講道理不能說是定義爲常量,而應該叫作不能被修改的變量。

由於被 final 修飾的變量只能在類初始化時賦值一次。在編譯時咱們看不到其值。

全部內置的變量類型

Dart 內置支持下面這些類型:

  • numbers
  • strings
  • booleans
  • lists (也被稱之爲 arrays)
  • maps
  • runes (用於在字符串中表示 Unicode 字符)
  • symbols

簡單說兩個

numbers

Dart 支持兩種數值類型 int double ,這兩種類型都是 num 的子類

也就是說只要你定義的是數值類型,就能夠用 num 來接收。

strings

String 能夠用雙引號或者單引號來聲明。

在字符串中能夠用表達式 ${},也能夠用 + 號來拼接字符串。

其餘的就不說了,至於後兩個很大可能用不到。

方法

Dart 是一個真正的面嚮對象語言,方法也是對象而且具備一種類型, Function類型。

也就是說,咱們能夠把方法賦值成變量,來傳入另外一個方法。

一個簡單的方法

來定義一個簡單的方法:

Widget build(BuildContext context) {
  return Container();
}
複製代碼

就拿 Flutter 中的 build來講,這就是一個最基本的 Dart 方法。

返回類型爲 Widget, 形參爲 BuildContext。裏面只有一行代碼 return Container();

那對於一個方法中只有一個表達式的,咱們能夠這麼寫:

Widget build(BuildContext context) => Container();
複製代碼

這個 => Container(); 語法是 { return Container; } 形式的縮寫。=> 語法也稱爲 胖箭頭 語法。

可選參數

方法能夠有兩種類型的參數:必需的和可選的。 必需的參數在參數列表前面, 後面是可選參數。

在 Dart 中可選參數也有兩種,可選命名參數 和 可選位置參數

可選命名參數
String demo(String name, {int age}){
  String result = '個人名字叫$name';
  if(age != null){
    result += ',我今年$age歲了';
  }
  return result;
}
複製代碼

這就是一個可選的命名參數,咱們這樣調用:

demo('HaSaKi', age: 18);
複製代碼
可選位置參數

咱們把剛纔的demo 方法改造一下:

String demo(String name, [int age]){
  String result = '個人名字叫$name';
  if(age != null){
    result += ',我今年$age歲了';
  }
  return result;
}
複製代碼

把大括號改成了中括號,這樣就成爲了可選位置參數的方法。

要這樣調用:

demo('HaSaKi', 18);

複製代碼

參數默認值

在定義方法的時候,咱們可使用 = 來定義參數的默認值

默認值必須是編譯時常量。

舉個例子:

String demo(String name, {int age = 18}){
  String result = '個人名字叫$name';
  if(age != null){
    result += ',我今年$age歲了';
  }
  return result;
}

複製代碼

這個方法如今就算不傳 age 的值,也永遠都會輸出,我今年18歲了。由於給了age默認值。

Dart 中的類和Java 相似,單繼承,而且 Object 是全部類的超類。

定義一個類:

class Person{
  String name;
  int age;
  
  say(){
    assert(name == null);
    print('我叫$name');
  }
}

複製代碼

能夠說和其餘語言同樣了。

下面來點不同的。

簡化變量賦值

在其餘語言中,咱們常常會使用構造函數來給類變量賦值。

因爲這種需求特別常見,因此 Dart 提供了一個語法糖:

class Person {
  String name;
  int age;
  
  Person(this.name, this.age);

  say() {
    assert(name == null);
    print('我叫$name');
  }
}

複製代碼

命名構造函數

在 Dart 中,可使用命名構造函數來更清晰的表達你的意圖:

class Person {
  String name;
  int age;

  Person.fromJson(Map json) {
    this.name = json['name'];
    this.age = json['age'];
  }

  say() {
    assert(name == null);
    print('我叫$name');
  }
}


複製代碼

工廠構造方法

若是一個構造函數並不老是返回一個新的對象,則使用 factory 來定義這個構造函數。

單例也是咱們常用的, 咱們可使用工廠構造方法來讓咱們實現單例:

class Person {
  static final Person _person = Person._internal();

  factory Person() {
    return _person;
  }

  Person._internal();
}


複製代碼

能夠看到,咱們定義了一個私有命名構造函數,也定義了一個工廠構造函數。

定義一個 final 的 Person 對象,而後用工廠構造函數返回它。

咱們來測試一下:

print(Person() == Person());

flutter: true

複製代碼

能夠證實這樣寫是沒問題的。

級聯調用

咱們平時爲類的值賦值或調用方法的時候,是這麼寫的:

var person = Person();
person.name = '哈哈';
person.age = 18;
person.say();

複製代碼

有沒有很麻煩?Dart 也爲咱們考慮到了:

Person()
  ..name = '哈哈'
  ..age = 18
  ..say();

複製代碼

總結

目前就寫這麼多基礎的知識吧,能夠看到 Dart 爲咱們開發人員考慮了不少,是個現代化語言該有的樣子。

而如今咱們在Flutter 當中所看到的 Dart 代碼只是冰山一角,後續我也會繼續爲你們寫Dart 系列。

請持續關注。

相關文章
相關標籤/搜索