這一篇咱們不講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 代碼都是從 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 在類中的話,就必須定義爲 static const.
final 講道理不能說是定義爲常量,而應該叫作不能被修改的變量。
由於被 final 修飾的變量只能在類初始化時賦值一次。在編譯時咱們看不到其值。
Dart 內置支持下面這些類型:
簡單說兩個
Dart 支持兩種數值類型 int double ,這兩種類型都是 num 的子類
也就是說只要你定義的是數值類型,就能夠用 num 來接收。
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 系列。
請持續關注。