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<int> login(String username,String pwd) {}
// 获取用户信息
Future<String> 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);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,089评论 1 32
  • 标签(空格分隔): Dart Flutter Dart在静态语法方面和Java非常相似,如类型定义、函数声明、泛型...
    黄昭鸿阅读 410评论 0 0
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,367评论 0 5
  • 忧伤的眼眸,因为第一场雪,变得平静。它来的突然,带给我惊喜,无准备的我站在寒风中瑟瑟发抖,抬头望天,雨中夹着雪,...
    凉城执念阅读 359评论 0 0
  • 雨薇跟老公大林离婚六年了,他们有一个女儿小萱,今年八岁,离婚时被判给了大林,却一直是大林的父母在抚养,住在乡下。...
    圆圆_圈圈_圆圆阅读 324评论 3 1