一、Dart語言介紹
Dart語言是由谷歌公司開發的網絡程式語言,於2011年10月10日發布。有了Dart,你可用的網頁腳本將不只是Java專屬.在使用Chromium的瀏覽器中,你可以直接運行Dart程序,而且有可靠的虛擬機幫助你提升程序性能和安全性.
即使你的瀏覽器不支持Dart語言,Dart也可以被轉換為Java代碼,也不必再擔心兼容上的問題.
同時,Dart還可以用來編寫桌面應用程式,這很像Java的Node.js。
二、Dart語言入門
Flutter使用dart語言來進行開發,dart官方也提供了在線編譯器來學習dart語言語法
2.1 程序入口 main函數
// 這是dart程序執行的入口。
main() {
var number = 42; // 定義並初始化一個變量。
printNumber(number); // 調用一個方法。
}
在dart應用裡,main函數表示程序的執行入口,執行一個dart應用,就會調用文件的main函數進行啟動。
2.2 變量
main() {
var a = 'a';
int b = 10;
String s = "hello";
}
你可以明確指定某個變量的類型,如int bool String,也可以用var或 dynamic來聲明一個變量,Dart會自動推斷其數據類型。
Dart有如下幾種內建的數據類型:
1、numbers 數字
2、strings 字符串
3、booleans 布爾
4、lists(或者是arrays) 數組
5、Maps
6、runes(UTF-32字符集的字符)
7、Symbols
下面用代碼說明:
main() {
// numbers
var a = 0;
int b = 1; //整數
double c = 0.1; //浮點數
// strings
var s1 = 'hello';
String s2 = "world";
// booleans
var real = true;
bool isReal = false;
// lists
var arr = [1, 2, 3, 4, 5];
List<String> arr2 = ['hello', 'world', "123", "456"]; //String的數組
List<dynamic> arr3 = [1, true, 'haha', 1.0]; //自動推斷數據類型
// maps
var map = new Map();
map['name'] = 'zhangsan';
map['age'] = 10;
Map m = new Map();
m['a'] = 'a';
//runes,Dart 中 使用runes 來獲取UTF-32字符集的字符。String的 codeUnitAt and codeUnit屬性可以獲取UTF-16字符集的字符
var clapping = '\u{1f44f}';
print(clapping); // 列印的是拍手emoji的表情
// symbols
print(#s == new Symbol("s")); // true
}
注意:沒有賦初值的變量都會有默認為null
2.3 函數
Dart 的函數支持函數聲明、函數字面量、箭頭函數、函數表達式、匿名函數。
int add(int a, int b) {
return a + b;
}
// 類型可省略
add(a, b) {
return a + b;
}
// 箭頭函數
var add = (a, b) => a + b;
int add(int a, int b) => a + b;
// 可選參數,使用 [] 限定
int add(int a, int b, [int c = 1, int d = 2]) => a + b + c + d;
// 顯示指定參數名稱,默認參數
int add({ int a = 1, int b = 2 }) {
return a + b;
}
add(a: 1, b: 2);
2.3 操作符
操作符包括了:expr++、expr--、()、[]、.、?、等,基本和 ES6 一致,除了沒有 === 的判斷。
例外有三個特色的操作:is、as、is?。
// is運算符用於判斷一個變量是不是某個類型的數據
// is!則是判斷變量不是某個類型的數據
var s = "hello";
print(s is String); // true
var num = 6;
print(num is! String); // true
// ~/才是取整運算符,如果使用/則是除法運算,不取整
int k = 1;
int j = 2;
print(k / j); // 0.5
print(k ~/ j); // 0
// as運算符類似於Java中的cast操作,將一個對象強制類型轉換
(emp as Person).teach();
// ??=運算符 如果 ??= 運算符前面的變量為null,則賦值,否則不賦值
var param1 = "hello", param2 = null;
param1 ??= "world";
param2 ??= "world";
print("param1 = $param1"); // param1 = hello
print("param2 = $param2"); // param2 = world
// ?.運算符
var str1 = "hello world";
var str2 = null;
print(str1?.length); // 11
print(str2?.length); // null
print(str2.length); // 報錯
2.4 控制流程
Dart 的控制流程支持:if、 if-else、 for、 while、 do-while、 switch、try-catch-finally
if (isRaining()) {
// ...
} else if (isSnowing()) {
// ...
} else {
// ...
}
var message = new StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
message.write('!');
}
var collection = [0, 1, 2];
for (var x in collection) {
print(x); // 0 1 2
}
2.5 類(Class)
類的定義與構造方法
Dart中的類沒有訪問控制,所以你不需要用private, protected, public等修飾成員變量或成員函數,一個簡單的類如下代碼所示:
class Person {
String name;
int age;
String gender;
Person(this.name, this.age, this.gender);
sayHello() {
print("hello, this is $name, I am $age years old, I am a $gender");
}
}
上面的Person類中有3個成員變量,一個構造方法和一個成員方法,看起來比較奇怪的是Person的構造方法,裡面傳入的3個參數都是this.xxx,而且沒有大括號{}包裹的方法體,這種語法是Dart比較獨特而簡潔的構造方法聲明方式,它等同於下面的代碼:
Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
要調用Person類的成員變量或成員方法,可以用下面的代碼:
var p = new Person("zhangsan", 20, "male");
p.sayHello();
p.age = 50;
p.gender = "female";
p.sayHello();
Dart 中的實現接口類
class Impostor implements Person {
get _name => '';
String greet(String who) => 'Hi $who. Do you know who I am?';
}
2.6 模塊
Dart 的模塊導入。
// 全部導入,並且是全局變量
import 'dart:math';
max(1, 2);
// 別名
import 'dart:math' as math;
math.max(1, 2);
// 只導入部分
import 'dart:math' show min;
min(1, 2);
// 懶加載,類似 ES6 的 import()
import 'dart:math' deferred as math;
Future greet() async {
await math.max(1, 2);
}
2.7 異步
在 ES6 與異步相關的就是 Promise、async、await。而在 Dart 則是 Future、async、await。
使用 async/await 之前需要引入 dart:async 模塊。
import 'dart:async';
Future<String> lookUpVersion() async => '1.0.0';
Future main() async {
await for (var request in requestServer) {
handleRequest(request);
}
}
2.8 正則表達式
正則使用的是 RegExp 對象。
RegExp exp = new RegExp(r"(\w+)");
// 返回正則表達式匹配項的可迭代對象
exp.allMatches("abc def ghi");
// 搜索並返回第一個匹配項,沒有則返回null
exp.firstMatch("");
// 正則表達式是否找到匹配項
exp.hasMatch("as");
// 從第幾個字符開始匹配正則表達式
exp.matchAsPrefix("ab cd", 3);
// 返回正則表達式的第一個匹配字符串
exp.stringMatch("abc de");
// 返回正則表達式的字符串表示
exp.toString();
作者:源碼時代
本文版權歸源碼時代所有,轉載請註明出處,如果您覺得有用歡迎點讚留言,更多開發技術學習資料查看源碼時代主頁。