欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Dart语法笔记

程序员文章站 2022-05-02 13:12:07
...

Dart所有东西都是对象,继承自Object类
Dart关键字不存在interface,类和接口都是用class表示。用implements表示继承和实现。
没有初始化的变量都赋值为null。
final的值只能被设定一次。const 是一个编译时的常量。
实例变量可以为 final 但是不能是 const 。如果 const 变量在类中,请定义为 static const。
通过提供一个 r 前缀可以创建一个 “原始 raw” 字符串:

var s = r"In a raw string, even \n isn't special.";

当 Dart 需要一个布尔值的时候,只有 true 对象才被认为是 true。 所有其他的值都是 flase。这点和 JavaScript 不一样, 像 1、 “aString”、 以及 someObject 等值都被认为是 false。

var name = 'Bob';
if (name) {
  // 在js中会打印 dart中则不会
  print('You have a name!');
}

定义一个不变的list对象(编译时常量):

 var constantList = const [1,2,3];

定义一个编译时常量map集合

final constantMap = const{
	2:'helium',
	10:'neon',
	18:'argon',
};

定义方法时,使用可选参数,这不等于Java中的重载
分为可选命名参数和可选位置参数
可选命名参数定义形式 {参数一,参数二,…}

 Rectangle({this.origin = const Point(0, 0), this.width = 0, this.height = 0});

可选位置参数定义形式用[]表示

String say(String from, String msg, [String device]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}

操作符
-expr 负号 ~/ 除号,但是返回值是整数

赋值操作
??= 给值为null的变量赋值 如果变量不为null 则变量的值保持不变。

expr1 ?? expr2
如果 expr1 是 non-null,返回其值; 否则执行 expr2 并返回其结果

级联操作符

querySelector('#button') // Get an object.
  ..text = 'Confirm'   // Use its members.
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

var button = querySelector('#button');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));   两种代码等价

Dart类的简化

class  Bicycle{
  int cadence;
  int speed;
  int gear;
  
  Bicycle(this.cadence,this.speed,this.gear);
  
//   Bicycle(int cadence, int speed, int gear) {
//   this.cadence = cadence;
//   this.speed = speed;
//   this.gear = gear;
// 	}

	@override
  	String toString()=>'Bicycle: $speed mph';
}

异步支持
async await 要使用 await,其方法必须带有 async 关键字:

checkVersion() async {
  var version = await lookUpVersion();
  if (version == expectedVersion) {
    // Do something.
  } else {
    // Do something else.
  }
}

在一个方法上添加 async 关键字,则这个方法返回值为 Future。
Dart没有关键字public/private/protected, 上面两个构造函数等价

void main() {
  var bicycle = Bicycle(2,0,1);
  print(bicycle.cadence.toString());
  
  final bike = Bicycle(3,0,1);
  print(bike.cadence.toString());
}

Dart创建对象在Dart2中可以省略。
如果您知道变量的值不会更改,则可以使用final而不是var。
要将Dart标识符标记为私有,使用下划线开始其名称。添加getter 来转换为只读。修改后代码如下

class Bicycle {
  int cadence;
  int _speed = 0;
  int get speed => _speed;
  int gear;

  Bicycle(this.cadence, this.gear);

  void applyBrake(int decrement) {
    _speed -= decrement;
  }

  void speedUp(int increment) {
    _speed += increment;
  }

  @override
  String toString() => 'Bicycle: $_speed mph';
}

Dart创建可选参数构造函数

class Rectangle {
  int width;
  int height;
  Point origin;
  Rectangle({this.origin = const Point(0, 0), this.width = 0, this.height = 0});
  @override
  String toString() =>
      'Origin: (${origin.x}, ${origin.y}), width: $width, height: $height';
}

main() {
  print(Rectangle(origin: const Point(10, 20), width: 100, height: 200));
  print(Rectangle(origin: const Point(10, 10)));
  print(Rectangle(width: 200));
  print(Rectangle());
} 

Dart创建工厂

abstract class Shape {
  factory Shape(String type) {
    if (type == 'circle') return Circle(2);
    if (type == 'square') return Square(2);
    throw 'Can\'t create $type.';
  }
  num get area;
}

class Circle implements Shape {
  final num radius;
  Circle(this.radius);
  num get area => pi * pow(radius, 2);
}

class Square implements Shape {
  final num side;
  Square(this.side);
  num get area => pow(side, 2);
}

main() {
  final circle = Shape("circle");
  final square = Shape("square");
  print(circle.area);
  print(square.area);
}
相关标签: Dart