總體概述
- 運(yùn)算符
- 流程控制
- 類和對(duì)象
- 泛型
- 庫的使用
一联贩、運(yùn)算符
-
1.1橱野、Dart 所有的運(yùn)算符
描述 運(yùn)算符 一元后綴 expr++
expr--·
()
[]
.
?.
一元前綴 -expr
!expr
~expr
--expr
乘法類型 *
/
%
~/
加法類型 +
-
移動(dòng)位運(yùn)算 <<
>>
與位運(yùn)算 &
異或位運(yùn)算 ^
或位運(yùn)算 |
關(guān)系和類型測(cè)試 >=
<=
>
<
as
is
is!
等式 ==
!=
邏輯與 &&
邏輯或 ||
條件 expr1 ? expr2 : expr3
級(jí)聯(lián) ..
賦值 =
*=
/=
~/=
%=
+=
-=
<<=
>>=
&=
^=
\=
??=
提示:上表操作符的優(yōu)先級(jí)由上到下逐個(gè)減小,上面行內(nèi)的操作符優(yōu)先級(jí)大于下面行內(nèi)
使用操作運(yùn)算符時(shí)的順序据悔,如下// 使用括號(hào)來提高可讀性 if ((n % I == 0) && (d % i == 0)) // 可讀性較差 if (n % I == 0 && d % i == 0)
-
1.2、除法、整除婆廊、取余運(yùn)算
var num = 7; print(num / 3); // 除法操作, 結(jié)果2.3333.. print(num ~/ 3); // 整除操作取商, 結(jié)果2; print(num % 3); // 取余操作, 結(jié)果1;
-
1.3、
??=
賦值操作
當(dāng)變量為 null 時(shí)巫橄,使用后面的內(nèi)容進(jìn)行賦值淘邻。
當(dāng)變量有值時(shí),使用自己原來的值湘换。main(List<String> args) { var name1 = 'Lily'; print(name1); // var name2 = 'kobe'; var name2 = null; name2 ??= 'James'; // 當(dāng)name2初始化為kobe時(shí)宾舅,結(jié)果為kobe统阿,當(dāng)初始化為null時(shí),賦值了James print(name2); }
-
1.4筹我、條件運(yùn)算符:
-
第一種:Dart中包含一直比較特殊的條件運(yùn)算符:
expr1 ?? expr2
如果expr1是null扶平,則返回expr2的結(jié)果;
如果expr1不是null,直接使用expr1的結(jié)果蔬蕊。var temp = 'why'; var temp = null; var name = temp ?? 'kobe'; print(name);
-
第二種:三元表達(dá)式结澄,如果條件為真;則但會(huì) expr1岸夯,否則返回 expr2的值
condition ? expr1 : expr2
-
-
1.5咽筋、級(jí)聯(lián)語法:
..
某些時(shí)候,我們希望對(duì)一個(gè)對(duì)象進(jìn)行連續(xù)的操作龄毡,這個(gè)時(shí)候可以使用級(jí)聯(lián)語法薄声,類似于鏈?zhǔn)秸Z法class Person { String name; void run() { print("${name} is running"); } void eat() { print("${name} is eating"); } void swim() { print("${name} is swimming"); } } main(List<String> args) { final p1 = Person(); p1.name = 'why'; p1.run(); p1.eat(); p1.swim(); final p2 = Person() ..name = "why" ..run() ..eat() ..swim(); }
提示:級(jí)聯(lián)的
雙點(diǎn)
符號(hào)不是運(yùn)算符,這只是 Dart 語法的一部分破镰。
二餐曼、流程控制
-
2.1. if 和 else
和其他語言用法一樣String today = 'Monday' if (today == 'Monday') { print('今天是星期一'); } else { print('不知道今天是星期幾') }
提示:這里有一個(gè)注意點(diǎn):不支持非空即真或者非0即真,必須有明確的bool類型
String name = '小王' if (name) { // 這是錯(cuò)誤的寫法 }
-
2.2. 循環(huán)操作
基本的for循環(huán)for (var i = 0; i < 5; i++) { print(i); }
for in遍歷List和Set類型
var names = ['why', 'kobe', 'curry']; for (var name in names) { print(name); }
while和do-while和其他語言一致
break和continue用法也是一致 -
2.3. switch-case
普通的switch使用鲜漩,注意:每一個(gè)case語句源譬,默認(rèn)情況下必須以一個(gè)break結(jié)尾main(List<String> args) { var direction = 'east'; switch (direction) { case 'east': print('東面'); break; case 'south': print('南面'); break; case 'west': print('西面'); break; case 'north': print('北面'); break; default: print('其他方向'); } }
三、類和對(duì)象
Dart 作為高級(jí)語言支持買你洗那個(gè)對(duì)象的很多特性孕似,并且支持基于 mixin 的繼承方式踩娘。基于 mixin 的方式是指:一個(gè)類可以繼承多個(gè)父類喉祭,相當(dāng)于其他語言里的多繼承养渴。所有的類都有同一個(gè)基類 Object,這個(gè)特性類似于 Java 語言泛烙,Java所有類也都是繼承自 Object理卑,也就是說一切皆為對(duì)象。
-
3.1. 類的定義
在Dart中蔽氨,定義類用class關(guān)鍵字藐唠。
類通常有兩部分組成:成員(member)和方法(method)。
定義類的偽代碼如下:class 類名 { 類型 成員名; 返回值類型 方法名(參數(shù)列表) { 方法體 } }
編寫一個(gè)簡(jiǎn)單的Person類:
class Person { String name; eat() { print('$name在吃東西'); } }
提示:
- 這里有一個(gè)注意點(diǎn): 我們?cè)诜椒ㄖ惺褂脤傩?成員/實(shí)例變量)時(shí)鹉究,
并沒有加this
宇立; - Dart的開發(fā)風(fēng)格中,在方法中通常使用屬性時(shí)自赔,會(huì)省略
this
妈嘹,但是有命名沖突時(shí),this不能省略
绍妨;
我們來使用這個(gè)類蟋滴,創(chuàng)建對(duì)應(yīng)的對(duì)象染厅,
從Dart2開始,new關(guān)鍵字可以省略
main(List<String> args) { // 1.創(chuàng)建類的對(duì)象 var p = new Person(); // 直接使用Person()也可以創(chuàng)建 // 2.給對(duì)象的屬性賦值 p.name = '小王'; // 相當(dāng)于使用了 name 的 setter 方法 // 3.調(diào)用對(duì)象的方法 p.eat(); }
提示:類定義中所有的變量都會(huì)隱式的定義 setter 方法津函,針對(duì)非空的變量會(huì)額外增加 getter 方法肖粮。
- 這里有一個(gè)注意點(diǎn): 我們?cè)诜椒ㄖ惺褂脤傩?成員/實(shí)例變量)時(shí)鹉究,
-
3.2、構(gòu)造函數(shù)
-
<1>尔苦、普通構(gòu)造函數(shù)
構(gòu)造函數(shù)是用來構(gòu)造當(dāng)前類的函數(shù)涩馆,是一種特殊的函數(shù),函數(shù)名稱必須要和類名相同才行允坚。如下代碼為 User類添加了一個(gè)構(gòu)造函數(shù)魂那,函數(shù)里給User類的兩個(gè)成員變量初始化了值:class User { String name; int age; User(String name, int age) { this.name = name; this.age = age; } }
this 關(guān)鍵字指向了當(dāng)前類的實(shí)例,上面的代碼可以簡(jiǎn)化為
class User { String name; int age; User( this.name, this.age); @override String toString() { // TODO: implement toString return 'name=$name age=$age'; } }
- 注意一:當(dāng)有了自己的構(gòu)造方法時(shí)稠项,默認(rèn)的構(gòu)造方法將會(huì)失效涯雅,不能使用
當(dāng)然,你可能希望明確的寫一個(gè)默認(rèn)的構(gòu)造方法展运,但是會(huì)和我們自定義的構(gòu)造方法沖突活逆;這是因?yàn)?code>Dart本身不支持函數(shù)的重載(名稱相同, 參數(shù)不同的方式)。 - 注意二:這里我還實(shí)現(xiàn)了toString方法
- 注意一:當(dāng)有了自己的構(gòu)造方法時(shí)稠项,默認(rèn)的構(gòu)造方法將會(huì)失效涯雅,不能使用
-
<2>拗胜、 命名構(gòu)造函數(shù)
使用命名構(gòu)造函數(shù)從一個(gè)類或現(xiàn)有的數(shù)據(jù)中快速實(shí)現(xiàn)構(gòu)造函數(shù)蔗候,代碼如下所示class Person { String name; int age; Person( this.name, this.age); // 命名構(gòu)造方法 Person.withArgments(String name, int age) { this.name = name; this.age = age; } @override String toString() { return 'name=$name age=$age'; } } // 創(chuàng)建對(duì)象 var p1 = new Person(); print(p1); var p2 = new Person.withArgments('why', 18); print(p2);
在之后的開發(fā)中, 我們也可以利用命名構(gòu)造方法,提供更加便捷的創(chuàng)建對(duì)象方式,比如開發(fā)中埂软,我們需要經(jīng)常將一個(gè)Map轉(zhuǎn)成對(duì)象锈遥,可以提供如下的構(gòu)造方法
// 新的構(gòu)造方法 Person.fromMap(Map<String, Object> map) { this.name = map['name']; this.age = map['age']; } // 通過上面的構(gòu)造方法創(chuàng)建對(duì)象 var p3 = new Person.fromMap({'name': 'kobe', 'age': 30}); print(p3);
-
<3>、構(gòu)造函數(shù)初始化列表
我們來重新定義一個(gè)類Point, 傳入x/y勘畔,可以得到它們的距離distance:class Point { final num x; final num y; final num distance; // 錯(cuò)誤寫法 // Point(this.x, this.y) { // distance = sqrt(x * x + y * y); // } // 正確的寫法 Point(this.x, this.y) : distance = sqrt(x * x + y * y); }
上面這種初始化變量的方法, 我們稱之為
初始化列表(Initializer list)
-
<4>所灸、重定向構(gòu)造函數(shù)
在某些情況下, 我們希望在一個(gè)構(gòu)造方法中去調(diào)用另外一個(gè)構(gòu)造方法, 這個(gè)時(shí)候可以使用重定向構(gòu)造方法
,在一個(gè)構(gòu)造函數(shù)中炫七,去調(diào)用另外一個(gè)構(gòu)造函數(shù)(注意:是在冒號(hào)后面使用this調(diào)用)class Person { String name; int age; Person(this.name, this.age); Person.fromName(String name) : this(name, 0); }
-
<5>庆寺、常量構(gòu)造方法
在某些情況下,傳入相同值時(shí)
诉字,我們希望返回同一個(gè)對(duì)象
,這個(gè)時(shí)候知纷,可以使用常量構(gòu)造方法.
默認(rèn)情況下壤圃,創(chuàng)建對(duì)象時(shí),即使傳入相同的參數(shù)琅轧,創(chuàng)建出來的也不是同一個(gè)對(duì)象伍绳,看下面代碼:
這里我們使用identical(對(duì)象1, 對(duì)象2)
函數(shù)來判斷兩個(gè)對(duì)象是否是同一個(gè)對(duì)象:main(List<String> args) { var p1 = Person('why'); var p2 = Person('why'); print(identical(p1, p2)); // false } class Person { String name; Person(this.name); }
但是, 如果將構(gòu)造方法前加
const進(jìn)行修飾
,那么可以保證同一個(gè)參數(shù)乍桂,創(chuàng)建出來的對(duì)象是相同的冲杀,這樣的構(gòu)造方法就稱之為常量構(gòu)造方法
效床。main(List<String> args) { var p1 = const Person('why'); var p2 = const Person('why'); print(identical(p1, p2)); // true } class Person { final String name; const Person(this.name); }
提示:常量構(gòu)造方法有一些注意點(diǎn):
- 注意一:擁有常量構(gòu)造方法的類中,所有的成員變量必須是
final
修飾的. - 注意二: 為了可以通過常量構(gòu)造方法权谁,創(chuàng)建出相同的對(duì)象剩檀,不再使用 new 關(guān)鍵字,而是使用 const 關(guān)鍵字
- 如果是將結(jié)果賦值給 const 修飾的標(biāo)識(shí)符時(shí)旺芽,const 可以省略.
- 注意一:擁有常量構(gòu)造方法的類中,所有的成員變量必須是
-
<6>沪猴、工廠構(gòu)造方法
Dart提供了factory
關(guān)鍵字, 用于通過工廠去獲取對(duì)象main(List<String> args) { var p1 = Person('why'); var p2 = Person('why'); print(identical(p1, p2)); // true } class Person { String name; static final Map<String, Person> _cache = <String, Person>{}; factory Person(String name) { if (_cache.containsKey(name)) { return _cache[name]; } else { final p = Person._internal(name); _cache[name] = p; return p; } } Person._internal(this.name); }
提示
- 普通的構(gòu)造函數(shù):會(huì)自動(dòng)返回創(chuàng)阿金出來的對(duì)象,不能手動(dòng)返回
- 工廠構(gòu)造函數(shù)的最大特點(diǎn):可以手動(dòng)返回一個(gè)對(duì)象
-
<7>采章、setter和getter
默認(rèn)情況下运嗜,Dart中類定義的屬性是可以直接被外界訪問的。
但是某些情況下悯舟,我們希望監(jiān)控這個(gè)類的屬性被訪問的過程担租,這個(gè)時(shí)候就可以使用setter
和getter
了main(List<String> args) { final d = Dog("黃色"); d.setColor = "黑色"; print(d.getColor); } class Dog { String color; String get getColor { return color; } set setColor(String color) { this.color = color; } Dog(this.color); }
也可以如下:使用箭頭
class Dog { String color; Dog(this.color); String get getColor => color; set setColor(String color) => this.color = color; }
-
-
3.3、 類的繼承
繼承是面向?qū)ο缶幊碳夹g(shù)的一塊基石抵怎,因?yàn)樗试S創(chuàng)建分等級(jí)層次的類奋救。繼承就是子類繼承父類的特征和行為。使得子類對(duì)象(實(shí)例)具有父類的實(shí)例域和方法便贵;或子類從父類繼承方法菠镇,使得子類具有父類相同的行為。
面向?qū)ο蟮钠渲幸淮筇匦跃褪抢^承承璃,繼承不僅僅可以減少我們的代碼量利耍,也是多態(tài)的使用前提。
Dart中的繼承使用extends關(guān)鍵字盔粹,子類中使用super來訪問父類隘梨。
父類中的所有成員變量和方法都會(huì)被繼承,,但是構(gòu)造方法除外舷嗡。class Animal { int age; Animal(this.age); run() { print('在奔跑ing'); } } class Person extends Animal { String name; Person(String name, int age) : name=name, super(age); // 重寫父類的方法 @override run() { print('$name在奔跑ing'); } @override String toString() { return 'name=$name, age=$age'; } }
提示:子類中可以調(diào)用父類的構(gòu)造方法轴猎,對(duì)某些屬性進(jìn)行初始化:
- 子類的構(gòu)造方法在執(zhí)行前,將隱含調(diào)用父類的
無參默認(rèn)構(gòu)造方法
(沒有參數(shù)且與類同名的構(gòu)造方法)进萄。 - 如果父類沒有
無參默認(rèn)構(gòu)造方法
捻脖,則子類的構(gòu)造方法必須在初始化列表中通過super
顯式調(diào)用父類的某個(gè)構(gòu)造方法。
- 子類的構(gòu)造方法在執(zhí)行前,將隱含調(diào)用父類的
-
3.4中鼠、抽象類
父類本身可能并不需要對(duì)某些方法進(jìn)行具體的實(shí)現(xiàn)可婶,所以父類中定義的方法,,我們可以定義為抽象方法援雇。
什么是 抽象方法? 在Dart中沒有具體實(shí)現(xiàn)的方法(沒有方法體)矛渴,就是抽象方法。也就是定義了方法惫搏,可以不用實(shí)現(xiàn)具温。
抽象方法蚕涤,必須存在于抽象類中。
抽象類是使用abstract聲明的類铣猩。
下面的代碼中, Shape類就是一個(gè)抽象類, 其中包含一個(gè)抽象方法.// 抽象類不能實(shí)例化 abstract class Shape { getArea(); } class Circle extends Shape { double r; Circle(this.r); @override getArea() { return r * r * 3.14; } } // 注意:繼承抽象類后揖铜,必須實(shí)現(xiàn)抽象類的抽象方法,不比如我們必須實(shí)現(xiàn) Shape 的 getArea() class Reactangle extends Shape { double w; double h; Reactangle(this.w, this.h); @override getArea() { return w * h; } }
提示:
- 注意一:抽象類不能實(shí)例化剂习。如果我們想實(shí)例化蛮位,那么可以如下
- 注意二:抽象類中的抽象方法必須被子類實(shí)現(xiàn), 抽象類中的已經(jīng)被實(shí)現(xiàn)方法, 可以不被子類重寫。
-
3.5鳞绕、隱式接口
Dart中的接口比較特殊, 沒有一個(gè)專門的關(guān)鍵字來聲明接口失仁。
默認(rèn)情況下,定義的每個(gè)類都相當(dāng)于默認(rèn)也聲明了一個(gè)接口们何,可以由其他的類來實(shí)現(xiàn)(因?yàn)镈art不支持多繼承)
在開發(fā)中萄焦,我們通常將用于給別人實(shí)現(xiàn)的類聲明為抽象類:abstract class Runner { run(); } abstract class Flyer { fly(); } class SuperMan implements Runner, Flyer { @override run() { print('超人在奔跑'); } @override fly() { print('超人在飛'); } }
提示: implements 后面跟 當(dāng)做接口使用的類,那么該類必須實(shí)現(xiàn)
implements
后面所有類的方法 -
3.6冤竹、Mixin混入
Mixin(混入功能) 相當(dāng)于多繼承拂封,也就是說可以繼承多個(gè)類。
在通過implements實(shí)現(xiàn)某個(gè)類時(shí)鹦蠕,類中所有的方法都必須被重新實(shí)現(xiàn)(無論這個(gè)類原來是否已經(jīng)實(shí)現(xiàn)過該方法)冒签。
但是某些情況下,一個(gè)類可能希望直接復(fù)用之前類的原有實(shí)現(xiàn)方案钟病,怎么做呢?
使用繼承嗎萧恕?但是Dart只支持單繼承,那么意味著你只能復(fù)用一個(gè)類的實(shí)現(xiàn)肠阱。
-
Dart提供了另外一種方案: Mixin混入的方式
- 除了可以通過class定義類之外票唆,也可以通過mixin關(guān)鍵字來定義一個(gè)類。
- 只是通過mixin定義的類用于被其他類混入使用屹徘,通過with關(guān)鍵字來進(jìn)行混入走趋。
-
使用 with 關(guān)鍵字來實(shí)現(xiàn) Mixin功能,實(shí)例代碼如下所示:
main(List<String> args) { var superMan = SuperMain(); superMan.run(); superMan.fly(); } mixin Runner { run() { print('在奔跑'); } } mixin Flyer { fly() { print('在飛翔'); } } // implements的方式要求必須對(duì)其中的方法進(jìn)行重新實(shí)現(xiàn) // class SuperMan implements Runner, Flyer {} class SuperMain with Runner, Flyer { }
提示:上面定義一個(gè)類并不是一定要用
mixin
, 我們可以使用 calss
-
3.7噪伊、類成員和方法
前面我們?cè)陬愔卸x的成員和方法都屬于對(duì)象級(jí)別的, 在開發(fā)中, 我們有時(shí)候也需要定義類級(jí)別的成員和方法
在Dart中我們使用static關(guān)鍵字來定義:main(List<String> args) { var stu = Student(); stu.name = 'why'; stu.sno = 110; stu.study(); Student.time = '早上8點(diǎn)'; // stu.time = '早上9點(diǎn)'; 錯(cuò)誤做法, 實(shí)例對(duì)象不能訪問類成員 Student.attendClass(); // stu.attendClass(); 錯(cuò)誤做法, 實(shí)現(xiàn)對(duì)象不能訪問類方法 } class Student { String name; int sno; static String time; study() { print('$name在學(xué)習(xí)'); } static attendClass() { print('去上課'); } }
提示:static 是靜態(tài)方法簿煌,也是類方法,如果學(xué)過Swift的話就會(huì)知道
-
3.8鉴吹、枚舉類型
枚舉在開發(fā)中也非常常見, 枚舉也是一種特殊的類, 通常用于表示固定數(shù)量的常量值姨伟。-
<1>、枚舉的定義
枚舉使用enum
關(guān)鍵字來進(jìn)行定義:main(List<String> args) { print(Colors.red); } enum Colors { red, green, blue }
-
<2>拙寡、枚舉的屬性
枚舉類型中有兩個(gè)比較常見的屬性:
index: 用于表示每個(gè)枚舉常量的索引, 從0開始.
values: 包含每個(gè)枚舉值的List.main(List<String> args) { print(Colors.red.index); print(Colors.green.index); print(Colors.blue.index); print(Colors.values); } enum Colors { red, green, blue }
提示:枚舉類型的注意事項(xiàng):
注意一: 不能子類化、混合或?qū)崿F(xiàn)枚舉琳水。
-
注意二: 不能顯式實(shí)例化一個(gè)枚舉肆糕,如下代碼是錯(cuò)誤的
final color = Colors();
-
四般堆、泛型
-
4.1、泛型的含義
泛型通常是為了類型的安全而設(shè)計(jì)的诚啃,適當(dāng)?shù)刂付ǚ盒偷念愋蜁?huì)生成更好的代碼淮摔,可以使用泛型來減少代碼重復(fù)。Dart中使用<T>
的方式來定義泛型始赎。例如和橙,如果想要 List 只包含字符串,我們可以將其聲明為list<String>
造垛。如下所示var names = new List<String>(); name.addAll(['張三', '李四', '王五'])
-
4.2. List和Map的泛型
List使用時(shí)的泛型寫法:// 創(chuàng)建List的方式 var names1 = ['why', 'kobe', 'james', 111]; print(names1.runtimeType); // List<Object> // 限制類型 var names2 = <String>['why', 'kobe', 'james', 111]; // 最后一個(gè)報(bào)錯(cuò) List<String> names3 = ['why', 'kobe', 'james', 111]; // 最后一個(gè)報(bào)錯(cuò)
Map使用時(shí)的泛型寫法:
// 創(chuàng)建Map的方式 var infos1 = {1: 'one', 'name': 'why', 'age': 18}; print(infos1.runtimeType); // _InternalLinkedHashMap<Object, Object> // 對(duì)類型進(jìn)行顯示 Map<String, String> infos2 = {'name': 'why', 'age': 18}; // 18不能放在value中 var infos3 = <String, String>{'name': 'why', 'age': 18}; // 18不能放在value中
-
4.3. 類定義的泛型
如果我們需要定義一個(gè)類, 用于存儲(chǔ)位置信息Location, 但是并不確定使用者希望使用的是int類型,還是double類型, 甚至是一個(gè)字符串, 這個(gè)時(shí)候如何定義呢?- 一種方案是使用Object類型, 但是在之后使用時(shí), 非常不方便
- 另一種方案就是使用泛型.
Location類的定義:
Object方式
main(List<String> args) { Location l1 = Location(10, 20); print(l1.x.runtimeType); // Object } class Location { Object x; Object y; Location(this.x, this.y); }
Location類的定義:
泛型方式
main(List<String> args) { Location l2 = Location<int>(10, 20); print(l2.x.runtimeType); // int Location l3 = Location<String>('aaa', 'bbb'); print(l3.x.runtimeType); // String } class Location<T> { T x; T y; Location(this.x, this.y); }
如果我們希望類型只能是num類型, 怎么做呢?
main(List<String> args) { Location l2 = Location<int>(10, 20); print(l2.x.runtimeType); // 錯(cuò)誤的寫法, 類型必須繼承自num Location l3 = Location<String>('aaa', 'bbb'); print(l3.x.runtimeType); } class Location<T extends num> { T x; T y; Location(this.x, this.y); }
提示:
T extends num
也就是只能傳入num
類型 -
4.4魔招、泛型方法的定義
最初,Dart僅僅在類中支持泛型五辽。后來一種稱為泛型方法的新語法允許在方法和函數(shù)中使用類型參數(shù)办斑。main(List<String> args) { var names = ['why', 'kobe']; var first = getFirst(names); print('$first ${first.runtimeType}'); // why String } // 返回 list 的第一個(gè)元素 T getFirst<T>(List<T> ts) { return ts[0]; }
五、庫的使用
在Dart中杆逗,你可以導(dǎo)入一個(gè)庫來使用它所提供的功能乡翅。
庫的使用可以使代碼的重用性得到提高,并且可以更好的組合代碼罪郊。
Dart中任何一個(gè)dart文件都是一個(gè)庫蠕蚜,即使你沒有用關(guān)鍵字library聲明
- 5.1、引用庫
-
<1>悔橄、引用自己寫的庫
下圖是在項(xiàng)目文件下建立了一個(gè)Utils
文件夾靶累,里面一個(gè)一些dart
文件,Utils.dart
是專門用來放頭文件的, 其他我自己寫的工具文件,在其他文件使用的時(shí)候我們只需要導(dǎo)入Utils.dart
文件橄维,如:import 'Utils/utils.dart';
61588387053_.pic_hd.jpg提示尺铣,當(dāng)自己寫的工具文件和其他庫有沖突的時(shí)候,我們那可以給文件起別名争舞,如上面的日期文件
date.utils.dart
凛忿,我們可以如下,在調(diào)用 日期里面的方法的時(shí)候我們就可以newDate.
了import 'utils/date.utils.dart ' as newDate
庫文件中內(nèi)容的顯示和隱藏
- 如果希望只導(dǎo)入庫中某些內(nèi)容竞川,或者刻意隱藏庫里面某些內(nèi)容店溢,可以使用show和hide關(guān)鍵字
show關(guān)鍵字:可以顯示某個(gè)成員(屏蔽其他)
-
hide關(guān)鍵字:可以隱藏某個(gè)成員(顯示其他)
import 'lib/student/student.dart' show Student, Person; import 'lib/student/student.dart' hide Person;
- 如果希望只導(dǎo)入庫中某些內(nèi)容竞川,或者刻意隱藏庫里面某些內(nèi)容店溢,可以使用show和hide關(guān)鍵字
-
<2>、引用系統(tǒng)的庫
來自dart標(biāo)準(zhǔn)版委乌,比如dart:io床牧、dart:html、dart:math遭贸、dart:core(但是這個(gè)可以省略)//dart:前綴表示Dart的標(biāo)準(zhǔn)庫戈咳,如dart:io、dart:html、dart:math import 'dart:io';
-
<3>著蛙、引用第三方的庫删铃,在 pub.dev 搜索第三方庫,下面我們以 使用 http 為例
WechatIMG7.jpeg-
我們需要在我們的項(xiàng)目里面建立一個(gè)文件
pubspec.yaml
,里里有一些固定的格式name: wc description: a dart dependencies: http: ^0.12.1
提示:
- name: 名字
- description:描述
- dependencies: 第三方庫
-
上面寫好后我們需要在終端進(jìn)入項(xiàng)目踏堡,執(zhí)行下面的指令
pub get
提示猎唁,在執(zhí)行完
pub get
后會(huì)生成其他幾個(gè)文件,如:.packages
顷蟆、.dart_tool
诫隅、pubspec.lock
-
http 的使用,導(dǎo)入頭文件
import 'package:http/http.dart' as http; main(List<String> args) async { var url = 'http://rest.apizza.net/mock/3bb78bf66bbd102a95221370ba9ddc2f/test'; var response = await http.get(url); print('Response status: ${response.statusCode}'); print('Response body: ${response.body}'); }
-
-