Dart语法和java很接近,本篇就简要列出Dart不同的几点
首先看下常见的helloword
//main标准写法
void main() {
print('Hello World!');//注意: Dart和Java一样表达式以分号结尾
}
//dart中所有函数的类型都是可以省略的,省略的时候返回值类型为dynamic
main() {
print('Hello World!');
}
//如果函数内部只有一个表达式,可以省略大括号,使用"=>"箭头函数;
void main() => print('Hello World!');
//最简写形式
main() => print('Hello World!');
数据类型
在dart中的一切皆是对象,包括数字、布尔值、函数等,它们和Java一样都继承于Object, 所以它们的默认值也就是null.
在dart主要有: 布尔类型bool、数字类型num(数字类型又分为int,double,并且两者父类都是num)、字符串类型String、集合类型(List, Set, Map)、Runes类和Symbols类型(后两个用的并不太多)
double pi = 3.141592653;
int width = 200;
int height = 300;
print(width / height);//注意:这里和Kotlin、Java都不一样,两个int类型相除是double类型小数,而不是整除后的整数。
print(width ~/ height);//注意: 这才是dart整除正确姿势
print(666.6.toInt()); //666.6 转化成int
字符串类型(String)
在Dart中支持单引号、双引号、三引号以及$字符串模板用法和Kotlin是一模一样的。
String description = """
Hello Dart! Hello Dart!
Hello Dart!
Hello Dart! Hello Dart!
""";//三引号
num value = 2;
String result = "The result is $value";//单值引用
num width = 200;
num height = 300;
String square = "The square is ${width * height}";//表达式的值引用
类型检查(is和is!)和强制类型转换(as)
print(number is num);//true
print(distance is! int);//true
print(age as int);//18
var,final,const
var color; // 仅有声明未赋值的时候,这里的color的类型是dynamic,所以它的类型是可以变的
var colorKey = 'black'; //var声明变量 自动根据赋值的类型,推导为String类型,不能变成其他类型了
const PI = 3.141592653;//编译期就能初始化
final nowTime = DateTime.now();//运行时期初始化的
空安全运算符
result = expr1 ?? expr2
若expr1为null, 返回expr2的值,否则返回expr1的值
expr1 ??= expr2
若expr1为null, 则把expr2的值赋值给expr1
result = expr1?.value
若expr1为null, 就返回null,否则就返回expr1.value的值
级联操作符(..)
对一个对象中字段进行链式调用
question
..id = '10001'
..stem = '第一题: xxxxxx'
..choices = <String> ['A','B','C','D']
..hint = '听音频做题';
函数
函数参数列表传参规则
//num a, num b, num c, num d 最普通的传参: 调用时,参数个数和参数顺序必须固定
add1(num a, num b, num c, num d) {
print(a + b + c + d);
}
//[num a, num b, num c, num d]传参: 调用时,参数个数不固定,但是参数顺序需要一一对应, 不支持命名参数
add2([num a, num b, num c, num d]) {
print(a + b + c + d);
}
//{num a, num b, num c, num d}传参: 调用时,参数个数不固定,参数顺序也可以不固定,支持命名参数,也叫可选参数,是dart中的一大特性,这就是为啥Flutter代码那么多可选属性,大量使用可选参数
add3({num a, num b, num c, num d = 100}) {
print(a + b + c + d);
}
//num a, num b, {num c, num d}传参: 调用时,a,b参数个数固定顺序固定,c,d参数个数和顺序也可以不固定
add4(num a, num b, {num c, num d}) {
print(a + b + c + d);
}
main() {
add1(100, 100, 100, 100); //最普通的传参: 调用时,参数个数和参数顺序必须固定
add2(100, 100); //调用时,参数个数不固定,但是参数顺序需要一一对应, 不支持命名参数(也就意味着顺序不变)
add3(
b: 200,
a: 200,
c: 100,
d: 100); //调用时,参数个数不固定,参数顺序也可以不固定,支持命名参数(也就意味着顺序可变)
add4(100, 100, d: 100, c: 100); //调用时,a,b参数个数固定顺序笃定,c,d参数个数和顺序也可以不固定
}
在dart函数也是一种类型Function,可以作为函数参数传递,也可以作为返回值。
构造函数
abstract class Person {
String name;
int age;
double height;
//注意,这里写法可能大家没见过, 这点和Java是不一样,这里实际上是一个dart的语法糖
Person(this.name, this.age, this.height);
//与上述的等价代码,当然这也是Java中必须要写的代码
Person(String name, int age, double height) {
this.name = name;
this.age = age;
this.height = height;
}
}
class Student extends Person {//和Java一样同时使用extends关键字表示继承
//在 Dart里:类名(变量,变量,...) 是构造函数的写法, :super()表示该构造调用父类,这里构造时传入三个参数
Student(String name, int age, double height, double grade): super(name, age, height);
}
Future,await,async
Dart是单线程的,如何处理耗时的操作呢?Dart是基于单线程加事件循环来完成耗时操作的处理。
Future 对象封装了Dart 的异步操作,它有未完成(uncompleted)和已完成(completed)两种状态。
main(List<String> args) {
print("main function start");
var future = getNetworkData();
future.then((value) {
print(value);
});
print("main function end");
}
Future<String> getNetworkData() {
return Future<String>(() {
sleep(Duration(seconds: 3));
return "network data";
});
}
await,async它们可以让我们用同步的代码格式,去实现异步的调用过程,用来解决回调地狱的。通常一个async的函数会返回一个Future。
await 所在的函数必须添加async关键词。
Future<String> getNetworkData() async {
var result = await Future.delayed(Duration(seconds: 3), () {
return "network data";
});
return "请求到的数据:" + result;
}
login('name','password').then((token) => fetchUserInfo(token))
.then((user) => saveUserInfo(user));
// 可以换成
void doLogin() async {
String token = await login('name','password'); //await 必须在 async 函数体内
User user = await fetchUserInfo(token);
await saveUserInfo(user);
}
网友评论