dart语法

Posted by アライさん on 2021年08月11日

List constructor

1
2
3
4
5
6
7
8
9
10
11
12
class A {
String name = '';
}

class B {
final String name;
final List<A> aList;
B({
required this.name,
List<A>? aList,
}) : this.aList = aList ?? [] {}
}

没有初始化的属性为null

static、final、const

static修饰的成员变量属于类,而不是属于对象。
final必须初始化,之后不可变。
const只能修饰编译期间就能确定的值,值不可能改变。const修饰的集合里的元素也不可变。

异步

通过async函数和await表达式
或者可以使用Future功能

1
2
3
fileOperate() async{
var file = await readFile();
}

枚举

枚举可以用switch判断

1
2
3
4
5
enum Color{
red,
blue
}
List<Color> colors = Color.values;

异步forEach

1
await Future.forEach(rssUrlTable, (item) async {});

只读属性

1
2
3
class Bicycle {
int get speed => _speed;
}

export导出

比如将多个库导出为一个库,别人引用这一个就相当于引用了多个。

1
2
3
4
5
//bloc.dart
export 'ticker_bloc.dart';
export 'ticker_event.dart';
export 'ticker_state.dart';
//这样引用bloc.dart就相当于引用了这三个dart

列表查找

1
bool isExisted = list.contains(x);

firstWhere查找元素,找到制定的元素。orElse为null可能报错

1
2
3
4
5
6
7
8
//从beanListz中查找fileName = fileName的元素。
//如果有返回该元素,如果没有就在orElse中new一个
AppBean temp =
beanListz.firstWhere((bean) => (bean.fileName == fileName),
orElse: () => AppBean(
fileName: fileName,
));
widget = _progressBtn(model, temp);

=> 代表return

1
2
void main() => runApp(MyApp());
return runApp(MyApp());

可选参数

1
2
3
4
5
6
7
String getUserInfo(String name,String sex,[String from]){
if(from == null){
return "只有2个参数";
}else{
return "有3个参数";
}
}

所有函数都有返回值,隐式return null

as类型转换、is判断能否转换、!is判断不是相同类型

1
2
3
4
//user为null也不会报错
if(user is Member){
(user as Member).name = '名字';
}

??=空感知赋值、??判空操作、?.非空操作

1
2
a??='hello';//a为null时才赋值
c = a??b;//a不为null返回a,否则返回b

整除

1
2
5~/2 = 2
2/2 = 2.5

类型判断和转换

  • is判断是否能转换,为null不报错
  • as负责转换
1
2
3
4
//user为null也不会报错
if(user is Member){
(user as Member).name = '名字';
}

空安全

1
2
3
4
a?.m()
a = b ?? 1; //b不为null,a=b。b为null,a=1
a??b;//为null返回b,不为null才返回a
a?? = 'hello';//为null时才赋值

..级联操作

1
2
3
var paint = Paint()
..isAntiAlias = true
..strokeWidth = 3.0;

抽象类,自类必须实现抽象类中未实现的方法

1
2
3
4
5
6
abstract class DateBaseOperate{
//子类必须实现
void insert();
//子类无需实现
void delete(){}
}

枚举,枚举可以用swicth

Mixins混入,类似多重继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class X{
a(){print("X.a");}
}

class Y{
a(){print("Y.a");}
b(){print("Y.b");}
}

class T = Y with X;//把X混入YX替换掉Y里的同名方法

void main() {
T t = new T();
t.a();//调用X的a
t.b();//调用Y的b
}
1
2
3
//AppModel同时继承Model,LoginModel,AppDownloadModel
//将AppDownloadModel,LoginModel混入Model
class AppModel extends Model with LoginModel,AppDownloadModel{}

构造函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class User{
String name;
int age;
User(this.name,this.age);//固定参数版
User({this.name = '',this.age = 20});//可选参数版本
}
class User{
String name;
int age;
User(this.name,this.age);
User.fromJson(Map json){
name = json['name'];
age = json['age'];
}
}

链式函数

1
2
3
4
5
6
void main() {
final values = [1, 2, 3, 5, 10, 50];
//跳过第1项,取3项,分别调用scream,再循环输出
values.skip(1).take(3).map(scream).forEach(print);
}
String scream(int length) => "A${'a' * length}h!";