此篇介绍一下Dart语言的基础知识

说明

  1. Dart是Fuchsia操作系统的官方开发语言
  2. Dart是一门强类型语言,但同时仍然支持弱类型语言的某些特性
  3. Dart有自己的VM,可以像Java语言一样运行在虚拟机上,又可以被编译成Native Code直接运行在硬件上(比如Flutter)
  4. 在Dart中,一切皆是对象,一切数据类型均继承自Object,即使是一个整数或方法,甚至null
  5. Dart可以推断变量的类型,除非开发者明确表示某个变量不被指定为任何一种类型。建议使用静态类型,这样可以增强代码可读性,也方便代码分析。
  6. 没有指定类型的变量将会默认指定为dynamic类型
  7. Dart可以应用于前后端。比如可以开发客户端Web应用(Angular 2框架),同时也可以运行在服务端(借助DartVM)
  8. 作为库,可能包含一个或多个*.dart文件
  9. 在大多数情况下,所有的变量、方法和类等对外均可见,除非它们以“_”开头
  10. Dart提供两种运行模式:Production和Checked。默认情况下以Production方式运行,优先考虑性能,关闭类型检查和断言;而Checked模式更利于在开发阶段调试使用
  11. Dart支持顶级方法和顶级变量
  12. Dart代码分析工具可以指出警告和错误,错误分为编译错误和运行错误,编译错误会直接阻止代码运行,运行错误会在运行时抛出异常
  13. 代码简单示例
main(List<String> args) {
  print("Hello Dart!");
}

变量

  1. 变量的初始化方法

var name = "XiaoWang"
print(name)

当然也可以使用String或dynamic类型,而不是用var类对name进行声明。
对于局部变量,根据代码建议风格来说,优先建议使用var来声明变量。

  1. 未经初始化的变量的默认值为null

常量

  1. 在Dart语言中,可以使用final或const关键字来声明一个常量

final weight = 60.5
final int height = 180
const int age = 17
const gender = "male"

  1. const声明的常量是一种编译时常量。const关键字也可以用来创建不变的值,甚至定义构造函数为const类型,即不可变对象,且任意变量都可以有一个不变的值。
// 使用const创建常量值
var intList = const[];
intList = [1, 2, 3];

虽然intList的值为常量不可变,但由于其本身声明使用了var,因此它仍然可以改变其引用。相当于:

// 使用const创建常量值
const temp = [];
var intList_2 = temp;
intList_2 = [1, 2, 3];

基本数据类型

  1. Dart的数值包含Int和Double两种类型。声明Double类型的变量,如果值是一个整数,则会自动转换成Double类型。
  2. 字符串有单引号字符串和双引号字符串。有转义符,另外可以用加号连接字符串。还有三个单引号或双引号,可以保持大段文本的原格式。
var userName = "小刚";
final welcome = "$userName,欢迎使用";
print(welcome);
  1. 类型转换
// String转换为int
String s = "1000";
int i = int.parse(s);

// int转换为String
int i = 1000;
String s = i.toString();

// 指定位数,输出3.14
print(3.14159.toStringAsFixed(2));
  1. Dart提供三种核心集合类型:
    (1)列表List

var listExp = [1, "Hello", 3.14] // 列表中的元素可以混合不同类型
print(listExp.length)
print("长度为:" + listExp.length.toString())

(2)集合Set

var setExp = {'A', 'B', 'C', 1, 2, 3}
// 集合提供add()、remove()、contains()、clear()等方法
setExp.add('D')
setExp.remove('C')
print(setExp.contains(3))
setExp.clear()
// 另外还有一次性追加多个二元素的addAll()方法,以及removeAll()方法和containsAll()方法。
// 集合运算操作,有difference()、union()、intersection()等。

(3)映射Map

var mapExp = {
"a" : "aaa",
"b" : "bbb",
};
// 提供remove()方法和containsKey()判断,提供length()长度。

  1. Dart中的字符串是UTF-16编码的,对于超过的情况需要接入Runes类型。
  2. 只有一个表达式的方法,可以简单写法成:

int getInt() => 2 * getNumber();
// 这里=>等同于return,称为箭头语法

  1. 参数:必选参数和可选参数
    (1)在参数列表中,必选参数在最前面,可选参数随后。
    (2)参数在方法体中的引用方式需要使用$。
    (3)在Dart中,可选参数分为可选命名参数和基于位置的参数,二者是互斥关系,不能同时出现。
// 可选命名参数示例:大括号
int getPrice({bookName : "一般图书"}) {
    if (bookName == "热门图书") {
             return 50;
        } else {
            return 10;
        }
}

// 可选位置参数示例:中括号
String sayWelcome([String name = "你好"]) {
    return   "$name,欢迎使用";
}
  1. 主方法main方法返回void(即无返回值),有一个可选的参数List
  2. 检查两个方法是否相等,使用连等号(==)来判断。
  3. 在Dart中,如果一个方法没有声明返回类型和return语句,则默认为return null。
  4. 在Dart中,做除法无法整除时,会返回小数。如果只想要整数部分,可以使用“~/”。

print(9 ~/2);

  1. 如果两个对象均返回null,即使其类型不同,但其值相同,也是相等的。
  2. 类型判定运算符
    (1) as 类型转换
    (2) is 是指定类型
    (3) is! 非指定类型
  3. 级联运算符
    (1) 本质是一个特殊语法
    (2) 写法是两个点,用于在同一对象上的连续调用
    示例如:
// 原始写法
Point pExp = new Point();
pExp.setX(10);
pExp.setY(20);
pExp.setZ(30);
print(pExp.toString());

// 级联写法
print(new Point()..setX(10)..setY(20)..setZ(30)..toString())
  1. 条件成员访问运算符

?. 如果左边的对象不是null,则返回右边的值;反之则返回null

  1. 断言只在开发模式下起作用,在生产环境中无效。断言可以检查程序中某些可能出现的运行逻辑错误。
var intValue = 1000;
assert(intValue == 999);    // 开发环境中看到控制台报错,在生产环境中不会收到提示
  1. 异常
    (1) Dart语言提供了 Exception 和 Error 两类异常。还有它们的子类,还可以自定义异常类型,其中自定义的异常类型不能为空值。
throw new FormatException("Data format exception occurred");
// 抛出一个自定义的异常
throw 'custom exception';

(2) 在实际生产环境中,自定义异常通常的做法是写一个类,声明Error或Exception类中的方法。

  1. Catch
try {
    // xxxxx
} catch (e) {
    print(e.toString());
    // yyyyy
}

// 捕捉不同的多种类型异常
try {
} on RangeError {
} on FormatError {
} catch(e) {
}

// 再次抛出异常使用rethrow
try {
} on RangeError {
    // xxxxx
    rethrow;
} catch (e) {
}
  1. Finally
try {
} catch (e) {
} finally {
    print("done");
}