Dart
官方教程https://www.dartlang.org/guides/language/language-tour
官方在线编译器https://dartpad.dartlang.org/
语言方面
感觉就是提供动态类型的静态类型、既能AOT也能JIT的javascript...
- 所有类型均继承于
Object
,包括int
这种基本类型 - 所有类型默认初始值为
null
var
自动推导类型,dynamic
才是动态类型const
和final
的区别就是一个编译前一个运行中- 整除是
~/
is!
是is not
,有意思as
这个关键字就更niub了,就是一个强制类型转换
if (emp is Person) {
// Type check
emp.firstName = 'Bob';
}
等价于
(emp as Person).firstName = 'Bob';
若emp
不是Person
,就会抛出错误
expr1 ?? expr2
的??
操作符niub,等价于expr1 != null ? expr1 : expr2
..
操作符,更niub了,你见过这样的写法吗?
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!'));
酷炫
?.
操作符,若foo == null
,foo.bar
会抛出错误,但foo?.bar
则返回null
- 字符串format的例子
void main() {
int a = 1;
int aa = 2;
print('$a');
print('$aa');
print('${a}a');
}
/* 输出
1
2
1a
*/
- 支持这样的
switch
写法
var command = 'CLOSED';
switch (command) {
case 'CLOSED': // Empty case falls through.
case 'NOW_CLOSED':
// Runs for both CLOSED and NOW_CLOSED.
executeNowClosed();
break;
}
Dart 2
之后,new
关键字是可选项,可写可不写- 一些类的有趣用法
class Point {
num x, y;
Point(this.x); // 语法糖
}
void main() {
var a = Point(1);
print(a.x);
print(a.y);
print(a.runtimeType); // 每个类都有
print(a.runtimeType == Point);
}
/* 输出
1
null
Point
true
*/
- 重载一般的运算符就和c++差不多,但要注意重载
==
的时候不太一样,详细请看官网文档
Flutter
docker image
可以用cirrusci/flutter
。但要注意的是,这玩意locale
没有支持utf8
。。。。所以要是你的gitlab的用户名有非ascii
的字符,就会爆炸。。。
Flutter package get被墙
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
Gradle被墙
参见这篇文章
一些库
- OpenFlutter/fluwx,获取
access_token
需要看官方文档 - lishuhao/sy_flutter_wechat