flutter學(xué)習(xí)筆記(2)--Dart語(yǔ)言概覽

開(kāi)始前請(qǐng)至少準(zhǔn)備:

0.一定的面向?qū)ο缶幊袒A(chǔ)


Flutter應(yīng)用使用Dart語(yǔ)言進(jìn)行開(kāi)發(fā)

那么我們來(lái)快速熟悉一下Dart語(yǔ)言,以免之后在學(xué)習(xí)Flutter時(shí)被語(yǔ)言關(guān)卡住

如果你熟悉java和python語(yǔ)法,那么學(xué)習(xí)Dart語(yǔ)言幾乎沒(méi)有什么難度


這篇筆記的所有內(nèi)容總結(jié)自Dart官網(wǎng),如果有更多細(xì)節(jié)方面的問(wèn)題,可以移步https://www.dartlang.org/guides/language/language-tour閱讀官方說(shuō)明


注釋語(yǔ)法:

// 單行注釋

/*

多行注釋

*/

/// 文檔注釋


關(guān)鍵字:

保留關(guān)鍵字:

assert break case catch class const continue

default do else enum extends false final?

finally for if in is new null rethrow return super?

switch this throw true try var void while with

上下文關(guān)鍵字(contextual keywords):

僅在特定位置被理解為關(guān)鍵字

async hide on show sync

內(nèi)建標(biāo)識(shí)符關(guān)鍵字(built-in identifiers):

不可作為class名或type名或import前綴

abstract as covariant deferred

dynamic export external factory

Function get implements import

interface library mixin operator

part set static typedef

異步支持關(guān)鍵字:

await yield


變量:

聲明方式:

類型/var/dynamic 變量名 = 變量值;

變量存儲(chǔ)引用,所有的變量值都是object

變量的默認(rèn)值都是null

var聲明的變量在被賦值時(shí),編譯器會(huì)自動(dòng)推斷類型,一旦類型推斷完畢,變量的類型將不能發(fā)生變化

dynamic聲明的變量類型是不固定的

相同類型多變量的聲明:

int x,y = 1;

一起聲明的變量將被賦予相同的值


常量:

final或const關(guān)鍵字修飾的變量是常量

常量最多被賦值一次

賦值后無(wú)法改變

const常量的特殊之處:

const常量要求在編譯期就能夠完全確定它的值

相同的const常量對(duì)象可以多次聲明,但只會(huì)被創(chuàng)建一次

const修飾的集合和構(gòu)造類實(shí)例中的所有值也必須都是const常量或在編譯器可以確定的值


Dart內(nèi)建類型:

int和double:

int: 64字節(jié)整型-2^63 - 2^63 - 1

double: 64字節(jié)雙精度浮點(diǎn)型

int和double支持+,-,*,/,~/運(yùn)算符

int支持位運(yùn)算符,支持10進(jìn)制和16進(jìn)制(數(shù)值加0x前綴)表示法

double支持科學(xué)記數(shù)法,如1.1e2表示1.1*10^2

零除不會(huì)出現(xiàn)異常,而是得到NaN

字符串(String)類型:

使用雙引號(hào)或者單引號(hào)包含字符串文本

在字符串中使用占位符傳遞變量或表達(dá)式

String str='Dart Language';

print('字符串 $str 的長(zhǎng)度是: ${str.length}');//打印結(jié)果:字符串 Dart Language 的長(zhǎng)度是: 13

const字符串中占位符表示的變量也必須是const的

字符串比較使用==

String str1='Dart';

String str2='Dart';

print(str1==str2);//打印結(jié)果:true

字符串可使用+進(jìn)行拼接

使用'''或"""創(chuàng)建多行字符串

String multiLine='''

Dart

Flutter

''';

使用r前綴的字符串避免轉(zhuǎn)義

String str=r'Dart\nFlutter';

print(str);//打印結(jié)果:?Dart\nFlutter

字符串與數(shù)值互相轉(zhuǎn)換:

int str2int=int.parse('1');//String轉(zhuǎn)int

double str2double=double.parse('3.14');//String轉(zhuǎn)double

String int2str=1.toString();//int轉(zhuǎn)字符串

String double2str=3.1415926.toString();//double轉(zhuǎn)字符串

String double2strFixed=3.1415926.toStringAsFixed(2);//double轉(zhuǎn)字符串并保留小數(shù)點(diǎn)后2位

布爾(bool)類型:

true/false

數(shù)組(List)類型:

List list=[1,2,3];

Map類型:

Map map={

????'key1':'value1',

????'key2':'value2'

};

map['key3']='value3';//加入新的鍵值

Runes類型:

用于表示unicode碼

Symbol類型:

沒(méi)看懂,也不常用,以后用到了再回來(lái)補(bǔ)


函數(shù):

函數(shù)也是對(duì)象,類型是Function

聲明方式:

返回值類型 函數(shù)名(參數(shù)表){

????函數(shù)體

}

返回值類型可省略,類型將被推斷

任何函數(shù)沒(méi)有return語(yǔ)句,可以編譯通過(guò),但是運(yùn)行期返回值是null

Dart函數(shù)僅能返回一個(gè)結(jié)果

=>語(yǔ)法用于聲明僅有一行函數(shù)體的函數(shù),函數(shù)體不需要return語(yǔ)句

int add(int i1,int i2) => i1+i2;

函數(shù)可選參數(shù):

可以是位置的或者命名的,但兩種可選擇參數(shù)在函數(shù)中不能同時(shí)存在

可選參數(shù)必須放在必填參數(shù)之后

可選參數(shù)可以給定默認(rèn)值

否則默認(rèn)值都是null

void positionalOptParamExample(String param1,[int param2,bool param3=false]){

????//位置可選參數(shù)聲明方式

????//param3被給定默認(rèn)值false

}

void namedOptParamExample(String param1,{int param2=0,bool param3}){

????//命名可選參數(shù)聲明方式

????//param2被給定默認(rèn)值0

}

含有多個(gè)位置可選參數(shù)的函數(shù)在調(diào)用時(shí),只能按順序省略處于可選參數(shù)表后面的參數(shù)

比如一個(gè)函數(shù)有三個(gè)位置可選參數(shù),你可以只傳遞第一個(gè),省略后兩個(gè)

如果你要傳遞第三個(gè)參數(shù),那么前兩個(gè)參數(shù)也必須要傳遞

含有命名可選參數(shù)的函數(shù)在調(diào)用時(shí)需要以名值對(duì)(key:value)的形式傳遞命名參數(shù)

namedOptParamExample('param1',param2:1);

對(duì)于命名參數(shù)的傳遞順序沒(méi)有要求

Flutter中Widget構(gòu)造函數(shù)的傳參方式就是可選命名關(guān)鍵字

main函數(shù):

程序入口,有一個(gè)可選的List<String>參數(shù)

函數(shù)作為對(duì)象

將函數(shù)(或者lambda表達(dá)式)賦值給變量

通過(guò)該變量進(jìn)行函數(shù)調(diào)用

main(){

????var hello=func;

????var append=(String s1,String s2)=>print(s1+' '+s2);

????hello();//打印結(jié)果:?hello world

????append('hello','dart');//打印結(jié)果:?hello dart

}

void func(){

????print('hello world');

}

Dart支持閉包

closure(int i){

????return (double d)=>d*i;//使用lambda表達(dá)式產(chǎn)生一個(gè)匿名函數(shù),并作為外層函數(shù)的結(jié)果返回

}


運(yùn)算符:

算術(shù)運(yùn)算符:

+,-,*,%,++,--不細(xì)說(shuō)

除:/得到的結(jié)果是double類型

地板除:~/得到的結(jié)果是int類型

比較運(yùn)算符:

==,!=,>,<,>=,<=

類型測(cè)試運(yùn)算符:

is: obj is Type,判斷對(duì)象是否是某個(gè)類型的實(shí)例

is!: obj is! Type,判斷對(duì)象是否不是某個(gè)類型的實(shí)例

as: 類型轉(zhuǎn)換,obj as Type,將對(duì)象轉(zhuǎn)換為指定類型

賦值運(yùn)算符:

=

復(fù)合賦值運(yùn)算符"

+=,-=,*=,/=,~/=,%=.??=...

這里有個(gè)值得一說(shuō)的??=運(yùn)算符

a ??=value;// a如果為null,則賦值為value,否則,a的值不變

邏輯運(yùn)算符:

&&, ||, !

位運(yùn)算符:

& | ^(異或) ~(取反) << >>

條件運(yùn)算符:

? :(三目運(yùn)算符),??

a??b的含義是若a為null,返回b,否則返回a

其他值得一提的操作符

?.

在進(jìn)行對(duì)象的方法或者屬性調(diào)用時(shí),如果對(duì)象為null,直接返回null,若對(duì)象非空,返回方法結(jié)果或者屬性值


流程控制:

分支:

if(exp){

}

if(exp){

}else{

}

if(exp){

}else if(exp){

}else{

}

switch(obj){

case case0:

????break;

case case1:

????break;

????......

default:

????....

}

循環(huán):

for(var i=0;i<3;i++){

}

for(var x in collection){

}

while(exp){

}

do{

}while(exp)

支持break/continue控制流程,支持標(biāo)簽語(yǔ)法


斷言

用于調(diào)式,debug模式下如果斷言失敗,拋出異常

生產(chǎn)環(huán)境下斷言失效

assert(booleanExpr);

assert(booleanExpr,"斷言異常時(shí)附加的自定義信息")


異常:

dart的所有異常都是運(yùn)行期異常

在函數(shù)簽名中,無(wú)法像java那樣聲明可能產(chǎn)生的異常

dart可以拋出任意非空對(duì)象作為異常,這些對(duì)象無(wú)需是Exception的實(shí)例,但是不建議你在生產(chǎn)中這樣做

throw FormatException("自定義異常信息");//異常拋出示例

throw "任意非空對(duì)象作為異常示例";//拋出任意非空對(duì)象

try-catch-finally語(yǔ)法:

try{

}on AException catch (e){

}on BException catch (e){

}finally{

}

如果希望catch所有類型的異常,可以省略on XxException

如果不需要在catch語(yǔ)句塊中調(diào)用異常對(duì)象,則可以省略catch(e)

catch語(yǔ)句可以指定兩個(gè)參數(shù)catch (e,s),第二個(gè)參數(shù)表示異常棧對(duì)象

可以使用多個(gè)catch并列來(lái)分別捕獲不同的異常

注意并列異常之間的繼承關(guān)系,子類異常應(yīng)處于父類異常之前

如果希望在捕獲到異常后再次拋出,可以在catch語(yǔ)句塊中使用rethrow;

可以在try語(yǔ)句塊或catch語(yǔ)句塊之后追加finally語(yǔ)句塊


類:

類的聲明:

class Person {

????String name;

????bool gender;

}

成員變量和方法:

定義在類中的變量稱為成員變量

定義在類中的函數(shù)稱為方法

類成員的訪問(wèn)控制:

Dart沒(méi)有public,private等訪問(wèn)控制關(guān)鍵詞

變量名或方法名如果以下劃線_開(kāi)頭,則認(rèn)為是私有的

getter/setter:

類的成員變量都有一個(gè)隱式的getter方法

用于讀取該變量的值

非final成員變量有一個(gè)隱式setter方法

用于寫(xiě)入該變量的值

可以通過(guò)實(shí)現(xiàn)getter/setter方法來(lái)為類附加額外的成員變量(這種成員變量通常是通過(guò)對(duì)其他成員進(jìn)行運(yùn)算得到),使用關(guān)鍵字get和set

class Person{

????String get name=>this.name;

????set name(String name)=>this.name=name;

}

類的構(gòu)造函數(shù):

類通過(guò)構(gòu)造函數(shù)實(shí)例化對(duì)象

在Dart2中,調(diào)用構(gòu)造函數(shù)時(shí),可以省略new關(guān)鍵字

一般構(gòu)造函數(shù)的聲明:

class Person {

????String name;

????bool gender;

????//構(gòu)造函數(shù)的聲明

????Person(String name, bool gender) {

????????this.name = name;

????}

}

Dart還提供一種語(yǔ)法糖來(lái)簡(jiǎn)化構(gòu)造函數(shù)的聲明

class Person {

????String name;

????bool gender;

????Person(this.name, this.gender) ;

}

若不聲明構(gòu)造函數(shù)

類會(huì)具有一個(gè)隱式的未命名的無(wú)參構(gòu)造

命名構(gòu)造函數(shù):

上面說(shuō)過(guò)Dart不允許方法重載,如果希望在一個(gè)類中聲明多個(gè)構(gòu)造函數(shù),可以使用命名構(gòu)造函數(shù)

class Person {

????String name;

????bool gender;

????Person(this.name, this.gender) ;

????//命名構(gòu)造函數(shù)

????Person.init(String name){

????????this.name=name;

????}

}

調(diào)用父類構(gòu)造函數(shù):

構(gòu)造函數(shù)不會(huì)被繼承

默認(rèn)情況下,子類的構(gòu)造函數(shù)會(huì)隱式調(diào)用父類的未命名無(wú)參構(gòu)造,如果父類沒(méi)有未命名無(wú)參構(gòu)造,就必須顯式地調(diào)用一個(gè)父類的構(gòu)造函數(shù)

//這里假設(shè)Person繼承了一個(gè)父類,這個(gè)父類有一個(gè)id屬性,且沒(méi)有未命名無(wú)參構(gòu)造

Person(int id,String name, bool gender) : super(id){

????this.name=name;

????this.gender=gender;

}

構(gòu)造函數(shù)的初始化列表:

在Dart中還可以為構(gòu)造函數(shù)聲明初始化列表,在對(duì)象實(shí)例化之前完成一些校驗(yàn)或者賦值操作

初始化列表通常用于類的final屬性的賦值

class Student{

????final int id;

????final String name;

? ? //使用初始化列表的構(gòu)造函數(shù)

????Student(int id,String name):this.id=id,this.name=name;

}

總結(jié)一下一個(gè)具有初始化列表的構(gòu)造函數(shù)在被調(diào)用時(shí)發(fā)生了什么:

1.運(yùn)行初始化列表

2.調(diào)用父類構(gòu)造函數(shù)

3.執(zhí)行當(dāng)前構(gòu)造函數(shù)中的邏輯

構(gòu)造函數(shù)的重定向:

通常一個(gè)類聲明多個(gè)構(gòu)造函數(shù)時(shí),只是簡(jiǎn)單地調(diào)用已經(jīng)聲明的構(gòu)造函數(shù)中的賦值邏輯,這時(shí),可以將要聲明構(gòu)造函數(shù)重定向至其他構(gòu)造函數(shù),避免相同的邏輯被多次編寫(xiě)

注意:

1.僅能重定向至未命名的構(gòu)造函數(shù)

2.重定向構(gòu)造函數(shù)的方法體必須是空的

class Student{

????final int id;

????final String name;

????Student(int id,String name):this.id=id,this.name=name;

? ? //init構(gòu)造函數(shù)被重定向至上面的構(gòu)造函數(shù)

????Student.init(String name):this(0,name);

}

const構(gòu)造函數(shù):

如果希望一個(gè)類產(chǎn)生的實(shí)例是不變的,可以聲明const構(gòu)造函數(shù)

const構(gòu)造函數(shù)要求類的所有成員都是final的

調(diào)用const構(gòu)造器時(shí)需要const關(guān)鍵字來(lái)修飾,否則實(shí)例化的對(duì)象將不是const的

main(){

????const School school1=const School('北京大學(xué)','地址...');//const對(duì)象

????School school2=School('清華大學(xué)', '地址...');//非const對(duì)象

}

class School{

????final Stringname;

????final Stringaddress;

????const School(this.name,this.address);//const構(gòu)造函數(shù)

}

工廠構(gòu)造函數(shù):

工廠模式構(gòu)造函數(shù)使用factory關(guān)鍵字修飾

通常,這種構(gòu)造函數(shù)不會(huì)在每次調(diào)用時(shí)返回一個(gè)新的實(shí)例,而是可能從緩存中獲取已經(jīng)被創(chuàng)建的實(shí)例

class Logger {

????final String name;

????bool mute =false;

? ? static final Map_cache = {};

? ? factory Logger(String name) {

????????if (_cache.containsKey(name)) {

????????????return _cache[name];

????????}else {

????????????final logger =Logger._internal(name);

???????????? _cache[name] = logger;

????????????return logger;

????????}

????}

????Logger._internal(this.name);

}

抽象方法和抽象類

沒(méi)有方法體的類成員方法是抽象方法,使用abstract關(guān)鍵字修飾

包含抽象方法的類也需要由abstract關(guān)鍵字修飾

抽象方法可以由非抽象的子類進(jìn)行實(shí)現(xiàn)

但是如果希望抽象類也可以被實(shí)例化,則需要聲明一個(gè)factory構(gòu)造函數(shù)

隱式接口:

你可以用一個(gè)類實(shí)現(xiàn)另一個(gè)類(不一定是抽象類),因?yàn)槊總€(gè)類都有一個(gè)隱式的接口,這樣,一個(gè)api就有了多種實(shí)現(xiàn)

接口實(shí)現(xiàn)使用implements關(guān)鍵字

class A {

????String myFunc(String str) {

????????return "...$str...";

????}

}

class B implements A {

????String myFunc(String str) {

????????return "!!!$str!!!";

????}

}

繼承:

Dart支持單繼承,使用extends關(guān)鍵字

子類可以重寫(xiě)父類中的方法

可以使用@override注解對(duì)方法重寫(xiě)進(jìn)行檢查

操作符重寫(xiě):

在Dart中,操作符也可以被理解為對(duì)對(duì)象進(jìn)行方法調(diào)用,因此操作符也是可以重寫(xiě)的

< > <= >= - + / ~/ * % | ^ & << >> [] []= ~ ==等操作符支持重寫(xiě)

class Apple {

????ApplePenoperator +(Pen pen) =>ApplePen();

}

class Pen {}

class ApplePen {}

main(){

????Apple apple=Apple();

????Pen pen=Pen();

????ApplePen applePen=apple+pen;

}

==操作符的重寫(xiě)類似于java中的equals()方法重寫(xiě),需要同時(shí)重寫(xiě)hashCode的getter方法

枚舉:

聲明方式:

enum Color {red, green, blue }

使用.index獲取枚舉的聲明順序,從0開(kāi)始

使用Color.value獲取包含所有枚舉項(xiàng)的List

枚舉可以用于switch

mixin:

上面說(shuō)過(guò)Dart是單繼承的,如果一個(gè)類已經(jīng)繼承了另一個(gè)類,但是還希望復(fù)用第三個(gè),第四個(gè)類中的屬性和方法,就可以使用mixin(mix in兩個(gè)英文單詞的連寫(xiě),以為混入,不要讀成迷信)

mixin類的聲明使用mixin關(guān)鍵字,在類中混入其他類使用with關(guān)鍵字

//聲明父類

class SuperClass {

????void funcA() {

????????print("funcA called");

? ? }

}

//聲明第一個(gè)mixin類

mixin MixinClassA {

????void funcB() {

????????print("funcB in MixinClassA called");

????}

}

//聲明第二個(gè)Mixin類

mixin MixinClassB {

????void funcB() {

????????print("funcB in MixinClassB called");

????}

????void funcC() {

????????print("funcC called");

????}

}

//這個(gè)類繼承了 SuperClass類,同時(shí)混入了MixinClassA和 MixinClassB兩個(gè)類,它的實(shí)例可以調(diào)用這三個(gè)類的方法,注意 MixinClassA和?MixinClassB中都實(shí)現(xiàn)了 funcB方法, SubClass實(shí)例將調(diào)用 MixinClassB對(duì)于 funcB的實(shí)現(xiàn),即后混入的方法實(shí)現(xiàn)會(huì)覆蓋先混入的方法實(shí)現(xiàn)

class SubClass extends SuperClass with MixinClassA, MixinClassB {}

類變量和類方法:

在類中使用static關(guān)鍵字修飾的變量和方法可以直接使用類名.的形式調(diào)用,無(wú)需實(shí)例化對(duì)象

static變量在真正調(diào)用前不會(huì)初始化

在java中通常會(huì)用static來(lái)修飾工具類方法

Dart建議用頂級(jí)函數(shù)來(lái)實(shí)現(xiàn)工具方法,而不是寫(xiě)在類中

頂級(jí)變量,頂級(jí)函數(shù):

Dart中不是所有變量和函數(shù)都要定義在類中

直接定義在dart文件中的變量,函數(shù)被稱為頂級(jí)變量,頂級(jí)函數(shù)

泛型:

泛型集合:

泛型集合使編譯器在編譯階段可以確定集合元素的類型

List list=[1,2,3];

Map map={1:'value1',2:'value2'};

泛型類和泛型方法:

class GenericClass<T extends SuperClass> {

????void func(T param) {

? ? ? ? ...

????}

}


庫(kù):

庫(kù)的導(dǎo)入:

使用import關(guān)鍵字

Dart內(nèi)建庫(kù)的導(dǎo)入

import "dart:xxx";

導(dǎo)入其他第三方庫(kù)"

import "package:xxx/xxx.dart";

庫(kù)別名:

別名用于解決導(dǎo)入的兩個(gè)庫(kù)中存在沖突的標(biāo)識(shí)符的問(wèn)題,使用as關(guān)鍵字

import "package:lib1/lib1.dart";

import "package:lib2/lib2.dart as lib2";


Element e1=Element();

lib2.Element e2=lib2.Element();

庫(kù)的部分導(dǎo)入:

import "package:lib1/lib1.dart" show foo,bar;//只導(dǎo)入庫(kù)的部分內(nèi)容

import "package:lib1/lib1.dart" hide foo,bar;//不導(dǎo)入庫(kù)的部分內(nèi)容

庫(kù)的懶加載:

使用deferred關(guān)鍵字

在需要時(shí)加載庫(kù),而不是運(yùn)行應(yīng)用時(shí)加載庫(kù),可以提高應(yīng)用的啟動(dòng)效率

對(duì)于很少使用的庫(kù),懶加載可以避免資源的浪費(fèi)

import 'package:lib1/lib1.dart' deferred as lib1

當(dāng)需要調(diào)用庫(kù)時(shí),調(diào)用lib1.loadLibrary()方法完成加載

可以多次調(diào)用loadLibrary方法,但庫(kù)只會(huì)加載一次


異步:

Dart中并不支持嚴(yán)格意義上的異步,而是將邏輯延遲執(zhí)行,這些被延遲執(zhí)行的邏輯被放入事件隊(duì)列,并在最終被遍歷執(zhí)行.Dart實(shí)際上是使用單線程模型來(lái)實(shí)現(xiàn)所謂的異步的.(這一部分我理解的還不是很透徹,以后用到了再回來(lái)補(bǔ)充.)

使用關(guān)鍵字await和async

異步方法返回一個(gè)Future<T>對(duì)象

Future<String> version() async {

????return "1.0.0";

}

在上面的async方法體中,返回值是String類型,但是會(huì)被封裝為Futrue<String>

如果異步方法什么也不打算返回,則返回值類型為Future<void>

異步方法調(diào)用時(shí),可附加await關(guān)鍵字,如果在一個(gè)方法的方法體中使用了await關(guān)鍵字,則這個(gè)方法需要聲明為async方法


生成器:

Dart支持兩種生成器

1.同步生成器,返回一個(gè)Iterable對(duì)象,使用sync*關(guān)鍵字

2.異步生成器,返回一個(gè)Stream對(duì)象,使用async*關(guān)鍵字

同步生成器:一個(gè)自然數(shù)生成器的實(shí)現(xiàn)

Iterable<int>?naturalsGenerator(int limit) sync* {

????int k =0;

? ? while (k < limit) {

????????//使用yield而不是return返回值

????????yield k++;

? }

}

Stream<int>?naturailsGeneratorAsync(int limit) async* {

????int k =0;

????while (k < limit) {

????????yield k++;

????}

}

使用await-for語(yǔ)句對(duì)Stream進(jìn)行處理

var stream = naturailsGeneratorAsync(10);

await for (var i in stream) {

? ? ? ?...

}


Callable類:

在類中實(shí)現(xiàn)call方法,該類對(duì)象可以視為方法進(jìn)行調(diào)用


Isolates:

上面說(shuō)過(guò)Dart是一種單線程模型的語(yǔ)言,每個(gè)Isolates分配獨(dú)立的內(nèi)存,不同的Isolates之間不能互相訪問(wèn)對(duì)方內(nèi)存中的資源


Typedef:

Dart中,方法也是對(duì)象,這個(gè)對(duì)象的類型是Function

但是Function類不會(huì)記錄具體方法對(duì)象的傳參方式和返回值類型

使用typedef聲明一個(gè)方法類型,所有與該方法類型傳參方式,返回值類型一致的方法,都是該方法類型的對(duì)象

typedef int tdFunc(int i, String str);

任何參數(shù)為int i,String str,且返回值為int的方法,都是類型為tdFunc的對(duì)象


元數(shù)據(jù)注解:

使用@符號(hào)附加的類,變量,標(biāo)注與類型/方法/參數(shù)/變量前,與反射搭配使用,常用的注解有@override(檢查重寫(xiě)),@deprecated(過(guò)時(shí)的類/方法/變量),@required(必傳參數(shù))

舉例實(shí)現(xiàn)一個(gè)元數(shù)據(jù)注解

class Todo {

????final Stringwho;

????final Stringwhat;

????const Todo(this.who, this.what);

}

@Todo("我", "實(shí)現(xiàn)這個(gè)方法")

void anUnimplMethod(){

}


級(jí)聯(lián)標(biāo)記:

用于連續(xù)對(duì)同一個(gè)對(duì)象進(jìn)行多次屬性設(shè)置或方法調(diào)用

可以簡(jiǎn)化語(yǔ)法

使用方法為:

obj

..屬性/方法調(diào)用

..屬性/方法調(diào)用

.......;

比如我們聲明一個(gè)有很多成員的類:

class Student{

????int id;

????String name;

????bool gender;

????String address;

????double height;

????double weight;

}

在java中,你在構(gòu)造這個(gè)對(duì)象后,需要調(diào)用一大堆setter方法來(lái)設(shè)置成員的值

在Dart中,我們使用級(jí)聯(lián)語(yǔ)法來(lái)完成這個(gè)任務(wù)

main(){

????Student s=Student();

????s

????..id=1

????..name='小明'

????..address='家庭住址'

????..gender=true

????..height=170.5

????..weight=99.9;

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腾降,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子摩幔,更是在濱河造成了極大的恐慌频鉴,老刑警劉巖弓摘,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盖呼,死亡現(xiàn)場(chǎng)離奇詭異羡铲,居然都是意外死亡春塌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門嗡综,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)乙帮,“玉大人,你說(shuō)我怎么就攤上這事极景〔炀唬” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵盼樟,是天一觀的道長(zhǎng)氢卡。 經(jīng)常有香客問(wèn)我,道長(zhǎng)晨缴,這世上最難降的妖魔是什么译秦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮击碗,結(jié)果婚禮上筑悴,老公的妹妹穿的比我還像新娘。我一直安慰自己稍途,他們只是感情好阁吝,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著械拍,像睡著了一般突勇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坷虑,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天甲馋,我揣著相機(jī)與錄音,去河邊找鬼猖吴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛挥转,可吹牛的內(nèi)容都是我干的海蔽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼绑谣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼党窜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起借宵,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤幌衣,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體豁护,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哼凯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了楚里。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片断部。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖班缎,靈堂內(nèi)的尸體忽然破棺而出蝴光,到底是詐尸還是另有隱情,我是刑警寧澤达址,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布蔑祟,位于F島的核電站,受9級(jí)特大地震影響沉唠,放射性物質(zhì)發(fā)生泄漏疆虚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一右冻、第九天 我趴在偏房一處隱蔽的房頂上張望装蓬。 院中可真熱鬧,春花似錦纱扭、人聲如沸牍帚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)暗赶。三九已至,卻和暖如春肃叶,著一層夾襖步出監(jiān)牢的瞬間蹂随,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工因惭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岳锁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓蹦魔,卻偏偏與公主長(zhǎng)得像激率,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勿决,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容