Dart语法笔记

Dart所有东西都是对象,继承自Object类
Dart关键字不存在interface,类和接口都是用class表示。用implements表示继承和实现。
没有初始化的变量都赋值为null。
final的值只能被设定一次。const 是一个编译时的常量。
var和dynamic的区别:
var在声明的变量赋值时,决定它的类型、dynamic则是在运行时动态去决定变量的类型。

var x = "字符串";
x =  100;(会报错)  //在赋值时x的类型是String

var y;
y = "字符串";
y = 100; (不会报错) //因为此时y的类型是Object

dynamic z = "字符串";
z = 100; (不会报错)

实例变量可以为 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);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值