1. 基础语法

1.1 hello world

先来看个hello world,入口依然是main方法.

  1. printInteger(int a) {
  2. print('Hello world, this is $a.');
  3. }
  4. main() {
  5. var number = 2019;
  6. printInteger(number);
  7. }

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(编译期常量)
  • 尽量为变量指定类型,这样编辑器额编译器能更好的理解你的意图
  1. var a = 1;
  2. int b = 1;
  3. num c = 3;
  4. int x = 1;
  5. int hex = 0xEEADBEEF;
  6. double y = 1.1;
  7. double exponents = 1.13e5;
  8. int roundY = y.round();
  9. //List
  10. var arr1 = ["Tom", "Andy", "Jack"];
  11. var arr3 = <String>["Tom", "Andy", "Jack"];
  12. var arr2 = List.of([1, 2, 3]);
  13. var arr4 = List<int>.of([1, 2, 3]);
  14. arr2.add(499);
  15. arr2.forEach((v) => print(v));
  16. //Map
  17. var map1 = {"name": "Tom", "sex": "male"};
  18. var map2 = new Map();
  19. //添加或修改
  20. map2["name"] = "Tom";
  21. map2["name"] = "Tom22";
  22. map2["sex"] = "male";
  23. print(map2);
  24. map2.forEach((k, v) => print('k = $k v=$v'));

1.3 函数

  • 函数是一个对象,类型Function,可以定义为变量
  • 函数可以只写一句代码,不要{}
  • 提供了可选命名参数和可选参数
  • 返回值类型可以省略
  1. void main() {
  2. Function f = isZero;
  3. int x = 10;
  4. int y = 10;
  5. printInfo(x, f);
  6. printInfo(y, f);
  7. enable1Flags(bold: true);
  8. }
  9. bool isZero(int a) {
  10. return a == 0;
  11. }
  12. bool isNull(var a) => a == null;
  13. void printInfo(int number, Function check) {
  14. print('$number is zero: ${check(number)}');
  15. }
  16. //可选命名参数 Flutter 中大量使用
  17. void enable1Flags({bool bold, bool hidden}) => print("$bold $hidden");
  18. //可选命名参数 加默认值
  19. void enable2Flags({bool bold = true, bool hidden = false}) =>
  20. print('$bold $hidden');
  21. //可忽略参数,也可以加默认值
  22. void enable3Flags(bool bold, [bool hidden]) => print("$bold $hidden");
  23. //返回值类型 省略
  24. price() {
  25. double sum = 0.0;
  26. for (var i in booking) {
  27. sum += i.price;
  28. }
  29. return sum;
  30. }

1.4 类

  • 没有public、protected、private这些修饰符,可以在变量和方法前面加_,_的限制范围并不是类级别的,而是库访问级别.
  • 对象调用方法时可以加?,加了之后如果对象是空,则跳过
  • 类A可以implements另一个类B,这时相当于implements B的方法和字段.
  • 当类A需要复用类B的方法时,可以使用混入(Mixin).class A with B{}
  • a ?? b a不为null,返回a.否则返回b.
  1. void main() {
  2. //类 都是继承自Object
  3. //无修饰符关键字 变量与方法前面加"_"则表示private,不加则为public
  4. //加"_"的限制范围并不是类访问级别的,而是库访问级别的
  5. Test test = Test();
  6. print(test.b);
  7. var p = Point(1, 2);
  8. p.printInfo();
  9. Point.factor = 10;
  10. Point.printZValue();
  11. //为空时跳过执行
  12. Point?.printZValue();
  13. var p2 = Point2.test(1);
  14. }
  15. class Test {
  16. int _a = 1;
  17. int b = 2;
  18. }
  19. class Point {
  20. num x, y;
  21. static num factor = 0;
  22. //语法糖,等同于在函数体内:this.x = x;this.y = y;
  23. Point(this.x, this.y);
  24. void printInfo() => print('($x,$y)');
  25. static void printZValue() => print('factor=$factor');
  26. }
  27. class Point2 {
  28. num x, y, z;
  29. //z也得到了初始化
  30. Point2(this.x, this.y) : z = 0;
  31. //重定向构造函数
  32. Point2.test(num x) : this(x, 0);
  33. }
  34. class Point3 {
  35. num x = 0, y = 0;
  36. void printInfo() => print('($x,$y)');
  37. }
  38. class Vector extends Point3 {
  39. num z = 0;
  40. //覆写了父类的方法
  41. @override
  42. void printInfo() => print('x = $x,y=$y');
  43. }
  44. class Coordinate implements Point3 {
  45. //成员变量需要重新声明
  46. num x = 0, y = 0;
  47. //成员函数需要重新实现
  48. @override
  49. void printInfo() {}
  50. }
  51. //混入Mixin 可以视为具有实现方法的接口
  52. //非继承的方法,使用其他类中的变量与方法
  53. class Coordinate2 with Point3 {}