Dart基本语法学习记录

参考《Flutter实战》

独特语法:

1、可选命名参数

2、..(级联操作符)

3、?.(条件成员访问运算符)

4、??(判空赋值运算符)

一些比较特别的语法

var 可接收任何类型变量,一旦赋值,类型就确定

如:

var t ;
t = "hello world";
t = 100;(此时报错)
dynamic/Object

dynamic和object声明的变量可以赋值任何对象,而且可以随时改变
如:

dynamic a;
Object b;
a = "hello world";
b = "hi world";
// 下面的代码可以通过编译
a = 100;
b = 100;

dynamic和Object不同的地方在于,dynamic声明的对象编译器可以提供所有可能
变量的方法使用,而Object则不提供
如:接上面代码

a = "hello world";
b = "hi world";
print(a.length);
// 下面会报错
print(b.length);
final、const

被两者修饰的变量,都是常量,值只能被设置一次;不同在于final是第一次使用时被初始化
const是编译时常量
且使用者两个,变量类型可忽略
如:

final a = "hello world";
const b = "hi world";

函数:

Dart函数声明如果没有显式声明返回值类型时会默认当dynamic处理
如:

typedef bool CALLBACK();
// 返回类型为dynamic
isNoble(int number) {
    return _nobleGases[number] != null;
}
// 需要传入bool函数
void test(CALLBACK cb) {
    print(cb());
}
// 报错 isNoble不是bool类型
test(isNoble);

函数里面只有一个表达式,可以使用简写语法
如:

bool isNoble(int number) => _nobleGases[number] != null;

函数作为一个变量

var say = (str) {
    print(str);
}
say("hello world");

函数作为参数传递

void dothing(var callback) {
    callback();
}
dothing(() => print("xxx"));

可选的位置参数 []标记的参数为可选参数
如:

String say(String from,String msg,[String to]) {
    var result = '$from says $msg';
    if (to != null) {
        result = '$result with a $to';
    }
    return result;
}

可选命名参数 使用{params1, params2,...}
如:

// 设置[flag]和[msg]标志
void sendMsg({bool flag,String msg}){
    //...
}
//调用
sendMsg(flag:true,msg:"hello world");

异步支持:

Future(有点类似Rxjava):表示一个异步操作的最终结果,异步成功,就执行成功后的操作;失败就捕获错误或停止后续操作。

一个Future只会对应一个结果;Future所有API返回的还是Future对象,因此可用于链式调用
Future.then 接收异步结果 (对应Rxjava中的onNext())
Future.catchError 异步发生错误,可以捕获 (对应Rxjava中的onError())
Future.whenComplete 异步完成 (对应Rxjava中的onComplete(),不过在Rxjava中onError和onComplete只执行一个,此处whenComplete无论如何都会执行)
如:

Future.delayed(new Duration(seconds:2),()) {
    return "hello world";
}).then((data){
        // 正常执行结束会执行下面代码
    print(data);
}).catchError((e){
    // 执行过程发生异常会执行下面代码
    print(e);
}).whenComplete((){
    // 成功失败都会执行下面代码
    print("done");
});

Future.wait 等待多个异步任务完成才进行操作(类似Rxjava中的flatMap,)

Future.wait([
    //  2秒后返回结果
    Future.delayed(new Duration(second:2),(){
        return "hello";
    }),
    //  4秒后返回结果
    Future.delayed(new Duration(second:4),(){
        return "world";
    })
]).then((results){
    print(results[0] + reults[1]);
}).catchError((e){
    print(e);
})

Async/await
async 用来表示函数异步,会返回一个Future对象,可以使用then方法添加回调函数
await后面是一个Future,表示等待该异步任务完成,异步完成后才往下走(阻塞)
如:传统的Future链式调用(模拟登陆)

// 定义异步任务
// 登陆
Future login(String username,String pwd) {}
// 获取用户信息
Future getUserInfo(int userId){}
// 保存用户信息
Future saveUserInfo(String userInfo){}
// 链式调用
Future("baiaj","123456").then((id){
    return getUserInfo(id);
}).then((userInfo){
    return saveUserInfo(userInfo);
}).then((e){
    // 执行接下来操作
}).catchError((e){
    // 错误处理
    print(e);
})

使用async/await消除callback hell(回调地狱)

task() async {
    int id = await login("baiaj","123456");
    String userInfo = await getUserInfo(id);
    await saveUserInfo(userInfo);
    // 执行接下来操作
}

Stream

可用于接收异步事件数据,在执行异步任务时,可以通过多次触发成功或失败事件来传递结果数据和错误
常用于网络任务下载 ,文件读写等。

Stream.fromFutures([
    // 1秒后返回结果
    Future.delayed(new Duration(second:1),(){
        return "hello 1";
    }),
    // 2秒后抛出一个异常
    Future.delayed(new Duration(second:2),(){
        return AssetitonError("Error");
    }),
    // 3秒后返回结果
    Future.delayed(new Duration(second:3),(){
        return "hello 3";
    })
]).listen((data){
    print(data);
},onError:(e){
    print(e.message);
},onDone:(){
    // 完成
});

操作符

.. 级联操作符(允许对同一对象执行一系列操作)
如:

// 普通调用
var button  = getButton();
button.text = 'hello world';
button.classes.add('imp');
button.onClick.listen((e)=>window.alert('confirmed'));
// 级联操作
getButton()
..text = 'hello world'
..classes.add('imp')
..onClick.listen((e)=>windown.alert('confirmed'));

?.(条件成员访问运算符)
获取成员,但是左边的对象可以为null

UserInfo userInfo = new UserInfo();
String name = userInfo.name;
UserInfo userInfo2;
// 此时userInfo2为null,获取的name为null
name = userInfo?.name;

??(判空赋值运算符)

var a = null;
String b = "hello world";
//  如果a为null,则返回b,否则返回b
// 此处返回b
var result = a ?? b;  
print(result);

你可能感兴趣的:(Dart基本语法学习记录)