1 Dart中的Int 相当于Java中的包装类型,其实Dart中一切都是对象,没有Java中的基本数据类型
void main() {
int count;
print(count);
}
count = null
2 定义字符串既可以使用单引号,也可以使用双引号,这个和JavaScript一致,和Java不一样
3 数组(在Dart中是List,因为Dart中一些都是对象,所以也没有Java中的数组了)和Map和JavaScript一致, 另外还有Set类型(元素不重复)
var names = ['张三','李四','王五']; // List
var gifts= {
'first':'partridge',
'second':'turtledoves',
'fifth': 'golden rings'
}
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'}; // Dart2.2 中才引入了 Set 字面量
List Set Map这些容器类都支持泛型,并且都可以用const修饰,定义成编辑期常量
4 有闭包(函数内部访问外包的变量,外包的变量无法得到释放)
5 没有===,这个和Java一致
6 数字类型只有int 和 double
7 构造函数, 和Java很接近
class Point {
num x, y;
// Syntactic sugar for setting x and y
// before the constructor body runs.
Point(this.x, this.y);
}
void main() {
var point = new Point(3, 4);
print("x : ${point.x}");
print("y : ${point.y}");
}
这样写构造函数其实是一种语法糖,完整写法是
Point(num x, num y) {
this.x = x;
this.y = y;
}
8 命名构造函数,我的理解就是有名字的构造函数,JAVA中的构造函数没有名字,因此经常会用静态工厂方法来创建对象,在Dart中改进了这一点
class Point {
num x, y;
// The main constructor for this class.
Point(this.x, this.y);
// Delegates to the main constructor.
Point.alongXAxis(num x) : this(x, 0);
}
void main() {
var point = Point.alongXAxis(4);
print("x : ${point.x}");
}
9 ?.和is 运算符,这个和Kotlin一致
10 创建一个Class的时候new是可选的,new Point(2, 2) 等同于 Point(2, 2)这个和Kotlin类似,不过Kotlin是强制省略
更新一下new 在Dart2中已经是不推荐的了,为得是Flutter声明布局的时候更清晰
Widget build(BuildContext context) {
return Row(
children: [
RaisedButton(
child: Text('Increment'),
),
Text('Click!'),
],
);
}
不推荐
Widget build(BuildContext context) {
return new Row(
children: [
new RaisedButton(
child: new Text('Increment'),
),
new Text('Click!'),
],
);
}
11 const 构造函数,相当于创建一个不可变类的实例,一旦创建,类中的属性都不可以改变,个人非常喜欢的一种设计,
如果需要改变属性,可以重新创建一个新的实例
同样在Dart2中const也建议尽量在常量上下文的环境中省去
const primaryColors = [
Color("red", [255, 0, 0]),
Color("green", [0, 255, 0]),
Color("blue", [0, 0, 255]),
];
不推荐
const primaryColors = const [
const Color("red", const [255, 0, 0]),
const Color("green", const [0, 255, 0]),
const Color("blue", const [0, 0, 255]),
];
12 常量对象?JAVA中好像没有类似的实现,有点接近于static 代码块(这个特性可以用来实现享元模式,用来实现类似java中的integer缓存了-128 到 127)
class User {
final String name;
const User(this.name);
}
void main() {
var a = const User("Dean");
var b = const User("Dean");
print(a==b); // true
}
注意上面的代码如果把User前的const去掉,就会打印false了
13 级联符号 .. 一种语法糖,帮你省去创建临时变量的步骤,不知道有多少人会用,反正我估计是不会去用,我建议大家也别去用,可读性不好
querySelector('#confirm') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
等价于
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
14 const 编译期常量,final 只能赋值一次,这个和java也差不多,只不过JAVA编辑期常量用的是 static
15