Dart 入门
Dart 介绍

Dart是谷歌开发的计算机编程语言,后来被Ecma (ECMA-408)认定为标准 。它被用于web、服务器、移动应用 和物联网等领域的开发。它是宽松开源许可证(修改的BSD证书)下的开源软件。
Dart是面向对象的、类定义的、单继承的语言。它的语法类似C语言,可以转译为JavaScript,支持接口(interfaces)、混入(mixins)、抽象类(abstract classes)、具体化泛型(reified generics)、可选类型(optional typing)和sound type system 。
dart 开发团队: https://github.com/dart-lang
1.1 hello world
先来看个hello world,入口依然是main方法.
printInteger(int a) {print('Hello world, this is $a.');}main() {var number = 2019;printInteger(number);}
1.2 变量与类型
- 定义变量使用var或者具体类型来定义
- 未初始化的变量的值都是null
- 所有东西都是对象,都是继承自Object.包括数字、布尔值、函数和 null
- 内置了一些基本数据类型num、bool、String、List 和 Map
- int和double都继承自num
- 常见的运算符也是继承自num
- Dart 的 String 由 UTF-16 的字符串组成,可以使用$xx或${xx}来把表达式放入字符串中
- List和Map,可以显示指定元素类型,也可以推断
- 常量定义使用final(运行时常量)或const(编译期常量)
- 尽量为变量指定类型,这样编辑器额编译器能更好的理解你的意图
var a = 1;int b = 1;num c = 3;int x = 1;int hex = 0xEEADBEEF;double y = 1.1;double exponents = 1.13e5;int roundY = y.round();//Listvar arr1 = ["Tom", "Andy", "Jack"];var arr3 = <String>["Tom", "Andy", "Jack"];var arr2 = List.of([1, 2, 3]);var arr4 = List<int>.of([1, 2, 3]);arr2.add(499);arr2.forEach((v) => print(v));//Mapvar map1 = {"name": "Tom", "sex": "male"};var map2 = new Map();//添加或修改map2["name"] = "Tom";map2["name"] = "Tom22";map2["sex"] = "male";print(map2);map2.forEach((k, v) => print('k = $k v=$v'));
1.3 函数
- 函数是一个对象,类型Function,可以定义为变量
- 函数可以只写一句代码,不要
{} - 提供了可选命名参数和可选参数
- 返回值类型可以省略
void main() {Function f = isZero;int x = 10;int y = 10;printInfo(x, f);printInfo(y, f);enable1Flags(bold: true);}bool isZero(int a) {return a == 0;}bool isNull(var a) => a == null;void printInfo(int number, Function check) {print('$number is zero: ${check(number)}');}//可选命名参数 Flutter 中大量使用void enable1Flags({bool bold, bool hidden}) => print("$bold $hidden");//可选命名参数 加默认值void enable2Flags({bool bold = true, bool hidden = false}) =>print('$bold $hidden');//可忽略参数,也可以加默认值void enable3Flags(bool bold, [bool hidden]) => print("$bold $hidden");//返回值类型 省略price() {double sum = 0.0;for (var i in booking) {sum += i.price;}return sum;}
1.4 类
- 没有public、protected、private这些修饰符,可以在变量和方法前面加
_,加_的限制范围并不是类级别的,而是库访问级别. - 对象调用方法时可以加
?,加了之后如果对象是空,则跳过 - 类A可以implements另一个类B,这时相当于implements B的方法和字段.
- 当类A需要复用类B的方法时,可以使用混入(Mixin).
class A with B{} a ?? ba不为null,返回a.否则返回b.
void main() {//类 都是继承自Object//无修饰符关键字 变量与方法前面加"_"则表示private,不加则为public//加"_"的限制范围并不是类访问级别的,而是库访问级别的Test test = Test();print(test.b);var p = Point(1, 2);p.printInfo();Point.factor = 10;Point.printZValue();//为空时跳过执行Point?.printZValue();var p2 = Point2.test(1);}class Test {int _a = 1;int b = 2;}class Point {num x, y;static num factor = 0;//语法糖,等同于在函数体内:this.x = x;this.y = y;Point(this.x, this.y);void printInfo() => print('($x,$y)');static void printZValue() => print('factor=$factor');}class Point2 {num x, y, z;//z也得到了初始化Point2(this.x, this.y) : z = 0;//重定向构造函数Point2.test(num x) : this(x, 0);}class Point3 {num x = 0, y = 0;void printInfo() => print('($x,$y)');}class Vector extends Point3 {num z = 0;//覆写了父类的方法@overridevoid printInfo() => print('x = $x,y=$y');}class Coordinate implements Point3 {//成员变量需要重新声明num x = 0, y = 0;//成员函数需要重新实现@overridevoid printInfo() {}}//混入Mixin 可以视为具有实现方法的接口//非继承的方法,使用其他类中的变量与方法class Coordinate2 with Point3 {}
