Dart-核心庫(kù)

?dart:core - numbers, collections, strings, and more

此庫(kù)自動(dòng)導(dǎo)入到每個(gè)Dart程序中狼速。

print()方法一個(gè)參數(shù)(任何Object)愧驱,并在控制臺(tái)中顯示該對(duì)象的字符串值(由toString()返回)。

數(shù)字

dart:core 庫(kù)定義了 num, int, and double 類

assert(int.parse('42')==42);

assert(int.parse('0x42')==66);

assert(double.parse('0.50')==0.5);

assert(num.parse('42')isint);

assert(int.parse('42',radix:16)==66); //指定進(jìn)制

// Convert a double to a string.

assert(123.456.toString()=='123.456');

// Specify the number of digits after the decimal.

assert(123.456.toStringAsFixed(2)=='123.46');

字符串

字符串搜索:contains(),?startsWith(),?endsWith(), indexOf()

字符串提取:[],substring(),split() , var codeUnitList='Never odd or even'.codeUnits.toList();

字符串大小寫:toUpperCase()宠互,toLowerCase()

字符串是否為空:isEmpty浴讯,isNotEmpty

字符串去除前后空白:trim()

字符串替換,返回新字符串:va rgreeting=greetingTemplate.replaceAll(RegExp('NAME'),'Bob');

字符串程序構(gòu)建:

var sb=StringBuffer();

sb

? ? ..write('Use a StringBuffer for ')

? ? ..writeAll(['efficient','string','creation'],' ')? //第二個(gè)參數(shù)是分隔符

? ? ..write('.');

var fullString=sb.toString();

字符串正則表達(dá)式:

// Here's a regular expression for one or more digits.

var numbers=RegExp(r'\d+');

assert(someDigits.contains(numbers));

var exedOut=someDigits.replaceAll(numbers,'XX');

numbers.hasMatch(someDigits) //匹配

集合

var vegetables=List(); //動(dòng)態(tài)類型

var fruits=['apples','oranges'];

var fruits=List<String>();

var appleIndex=fruits.indexOf('apples');

fruits.removeAt(appleIndex);

// Sort a list.

fruits.sort((a,b)=>a.compareTo(b));

可以自定義排序函數(shù):此排序函數(shù)必須返回<0表示小于,0表示相同的值辣吃,> 0表示大于动遭。

set支持集合運(yùn)算

var nobleGases=Set.from(['xenon','argon']);

var intersection=ingredients.intersection(nobleGases);

assert(ingredients.contains('titanium'));

assert(ingredients.containsAll(['titanium','xenon']));

var nobleGases=Map<int,String>();

assert(nobleGases.containsKey(54));

var keys=nobleGases.keys;

var values=nobleGases.values;

nobleGases.putIfAbsent('Catcher',()=>pickToughestKid());

hawaiianBeaches.forEach((k,v){print('I want to visit $k and swim at $v');});

//map()產(chǎn)生懶加載生成器對(duì)象,進(jìn)行轉(zhuǎn)化

map().toList()?or?map().toSet()

URIs

var uri='https://example.org/api?foo=some message';

var encoded=Uri.encodeFull(uri);

assert(encoded=='https://example.org/api?foo=some%20message');

var decoded=Uri.decodeFull(encoded);

var encoded=Uri.encodeComponent(uri);

assert(encoded=='https%3A%2F%2Fexample.org%2Fapi%3Ffoo%3Dsome%20message');

var decoded=Uri.decodeComponent(encoded);

var uri=Uri.parse('https://example.org:8080/foo/bar#frag');

assert(uri.scheme=='https')

;assert(uri.host=='example.org');

assert(uri.path=='/foo/bar');

assert(uri.fragment=='frag');

assert(uri.origin=='https://example.org:8080');

var uri=Uri(scheme:'https',host:'example.org',path:'/foo/bar',fragment:'frag');

assert(uri.toString()=='https://example.org/foo/bar#frag');

Dates and times

var now=DateTime.now();

vary 2k=DateTime(2000);// January 1, 2000

y2k=DateTime(2000,1,2);// January 2, 2000

y2k=DateTime.utc(2000);// 1/1/2000, UTC

y2k=DateTime.parse('2000-01-01T00:00:00Z');

y2k=DateTime.fromMillisecondsSinceEpoch(946684800000,isUtc:true);

日期的millisecondsSinceEpoch屬性返回自“ Unix紀(jì)元”(1970年1月1日神得,UTC)以來(lái)的毫秒數(shù):

// 1/1/1970, UTC

var unixEpoch=DateTime.utc(1970);

assert(unixEpoch.millisecondsSinceEpoch==0);

var y2001=y2k.add(Duration(days:366));

var december2000=y2001.subtract(Duration(days:30));

assert(december2000.year==2000);

assert(december2000.month==12);

var duration=y2001.difference(y2k);

assert(duration.inDays==366);// y2k was a leap year.

Utility classes

實(shí)現(xiàn)Comparable接口厘惦,以指示可以將一個(gè)對(duì)象與另一個(gè)對(duì)象進(jìn)行比較,通常用于排序哩簿。 compareTo()方法對(duì)于較小的返回<0宵蕉,對(duì)于相同的返回0,對(duì)于較大的返回> 0节榜。

class Line implements Comparable<Line>{

final int length;

const Line(this.length);

@override

int compareTo(Line other)=>length-other.length;

}

Dart中的每個(gè)對(duì)象都會(huì)自動(dòng)提供一個(gè)整數(shù)哈希碼羡玛,因此可以用作地圖中的鍵。 但是宗苍,您可以覆蓋hashCode getter以生成自定義哈希碼稼稿。 如果這樣做,您可能還想覆蓋==運(yùn)算符讳窟。 相等的對(duì)象(通過(guò)==)必須具有相同的哈希碼让歼。

重載相等

Iterable和Iterator類支持for-in循環(huán)。 每當(dāng)您創(chuàng)建一個(gè)可以提供for循環(huán)中使用的Iterator的類時(shí)丽啡,就擴(kuò)展(如果可能)或?qū)崿F(xiàn)Iterable谋右。 實(shí)現(xiàn)Iterator定義實(shí)際的迭代能力。

實(shí)現(xiàn)可迭代

自定義異常

class FooException implements Exception {

final String msg;

const FooException([this.msg]);

@override

String toString()=>msg??'FooException';

}

dart:async - asynchronous programming

import? 'dart:async';

//await

var entryPoint=await findEntryPoint();

try{

var exitCode=await runExecutable(entryPoint,args);

await flushThenExit(exitCode);

}catch(e){

// Handle the error...

}

//then

HttpRequest.getString(url).then((Stringresult){

print(result);

}).catchError((e){

// Handle or ignore the error.

});

//所有都完成

await Future.wait([deleteLotsOfFiles(),copyLotsOfFiles(),checksumLotsOfOtherFiles(),]);

//流

querySelector('#submitInfo').onClick.listen((e) { // When the button is clicked, it runs this code. submitData();});

如果只關(guān)心一個(gè)事件碌上,則可以使用諸如first倚评,last或single這樣的屬性來(lái)獲取它。 要在處理事件之前對(duì)其進(jìn)行測(cè)試馏予,請(qǐng)使用諸如firstWhere()天梧,lastWhere()或singleWhere()之類的方法。如果您關(guān)心事件的子集霞丧,則可以使用諸如skip()呢岗,skipWhile(),take()蛹尝,takeWhile()和where()之類的方法后豫。

var lines=inputStream.transform(utf8.decoder).transform(LineSplitter()); //流轉(zhuǎn)換

var lines = inputStream.transform(utf8.decoder)? .transform(LineSplitter());?

?try {? ? await for (var line in lines) {? ??

? ? ? ? ? ? ? print('Got ${line.length} characters from stream');??

? ? ? ? ? ? ? }? ??

? ? ? ? ? ? ? ?print('file is now closed');??

} catch (e) {? ? print(e);? }

inputStream

? ? .transform(utf8.decoder)? ??

? ?.transform(LineSplitter())? ??

? ? .listen((String line) {? print('Got ${line.length} characters from stream');},?

? ? ? ? ? ? ? ?onDone: () {? print('file is now closed');},?

? ? ? ? ? ? ? ? onError: (e) {? print(e);});

dart:math - math and random

dart:math庫(kù)提供了常用功能(例如正弦和余弦,最大值和最小值)以及常數(shù)(例如pi和e)突那。數(shù)學(xué)庫(kù)中的大多數(shù)功能都實(shí)現(xiàn)為頂級(jí)函數(shù)挫酿。

import 'dart:math';

var random=Random();

random.nextDouble();// Between 0.0 and 1.0: [0, 1)

random.nextInt(10);// Between 0 and 9.

random.nextBool();// true or false

dart:convert - decoding and encoding JSON, UTF-8, and more

import? 'dart:convert';

var jsonText=jsonEncode(scores);

var scores=jsonDecode(jsonString);

只有類型為int,double愕难,String早龟,bool惫霸,null,List或Map(帶有字符串鍵)的對(duì)象才能直接編碼為JSON葱弟。 List和Map對(duì)象是遞歸編碼的壹店。

您可以使用兩種方法對(duì)無(wú)法直接編碼的對(duì)象進(jìn)行編碼。 第一種是使用encode()的第二個(gè)參數(shù):一個(gè)函數(shù)芝加,該函數(shù)返回可直接編碼的對(duì)象硅卢。 您的第二個(gè)選擇是忽略第二個(gè)參數(shù),在這種情況下藏杖,編碼器將調(diào)用對(duì)象的toJson()方法将塑。

使用utf8.decode()將UTF8編碼的字節(jié)解碼為Dart字符串:

var funnyWord=utf8.decode(utf8Bytes);

var lines = utf8.decoder.bind(inputStream).transform(LineSplitter());? //流的轉(zhuǎn)換,結(jié)果還是流數(shù)據(jù)

List<int> encoded=utf8.encode('???ér???????????????'); //編碼

dart:html - browser-based apps

Only web apps can use dart:html, not command-line apps.

import? 'dart:html';

使用頂級(jí)函數(shù)querySelector()和querySelectorAll()查找一個(gè)或多個(gè)元素制市。 您可以按?ID, class, tag, name,或它們的任意組合進(jìn)行查詢抬旺。 CSS選擇器規(guī)范指南定義了選擇器的格式,例如使用#前綴指定元素ID以及使用.指定元素的類的ID祥楣。

querySelector()函數(shù)返回與選擇器匹配的第一個(gè)元素开财,而querySelectorAll()返回與選擇器匹配的元素的集合。

List<Element> elems2=querySelectorAll('input[type="text"]',);

elem.attributes['someAttribute']='someValue';

dart:io - I/O for servers and command-line apps

Only?Flutter mobile apps,?command-line scripts, and servers can import and use?dart:io, not web apps.

通常误褪,dart:io庫(kù)實(shí)現(xiàn)并提升了異步API责鳍。 同步方法很容易阻塞應(yīng)用程序,從而難以擴(kuò)展兽间。 因此历葛,大多數(shù)操作都是通過(guò)Future或Stream對(duì)象返回結(jié)果的。

dart:io庫(kù)中的一些同步方法在方法名稱上明顯帶有Sync后綴嘀略。

import? 'dart:io';

I / O庫(kù)使命令行應(yīng)用程序可以讀取和寫入文件以及瀏覽目錄恤溶。 您有兩種選擇來(lái)讀取文件的內(nèi)容:一次全部或流式傳輸。 一次讀取一個(gè)文件需要足夠的內(nèi)存來(lái)存儲(chǔ)文件的所有內(nèi)容帜羊。 如果文件很大咒程,或者您想在讀取文件時(shí)對(duì)其進(jìn)行處理,則應(yīng)使用流讼育,如流文件內(nèi)容中所述帐姻。

var config=File('config.txt');

contents=await config.readAsString(); //整個(gè)文本

contents=await config.readAsLines();//按行

?contents=awaitconfig.readAsBytes();//二進(jìn)制

流讀取

var config=File('config.txt');

Stream<List<int>> inputStream=config.openRead();

var lines=utf8.decoder.bind(inputStream).transform(LineSplitter());

寫文件

var logFile=File('log.txt');

var sink=logFile.openWrite();

var sink=logFile.openWrite(mode:FileMode.append);

sink.write('FILE ACCESSED ${DateTime.now()}\n');

await? sink.flush();

await? sink.close();

List<int> data :寫二進(jìn)制數(shù)據(jù)

查找目錄的所有文件和子目錄是異步操作。 list()方法返回一個(gè)Stream奶段,當(dāng)遇到文件或目錄時(shí)該Stream發(fā)出一個(gè)對(duì)象饥瓷。

File和Directory類包含其他功能,包括但不限于:

創(chuàng)建文件或目錄:文件和目錄中的create()

刪除文件或目錄:“文件和目錄”中的delete()

獲取文件的長(zhǎng)度:File中的length()

隨機(jī)訪問(wèn)文件:File中的open()

var file = File(Platform.script.toFilePath()); //當(dāng)前文件

dart:async庫(kù)包含對(duì)許多Dart API很重要的兩種類型:Stream和Future痹籍。 如果Future表示單個(gè)計(jì)算的結(jié)果呢铆,則流是一系列結(jié)果。 您偵聽(tīng)流以獲取有關(guān)結(jié)果(數(shù)據(jù)和錯(cuò)誤)以及流關(guān)閉的通知蹲缠。 您還可以在收聽(tīng)流時(shí)暫停播放或在流完成之前停止收聽(tīng)棺克。

幾種方式創(chuàng)建流:

改造現(xiàn)有流鳖宾。

通過(guò)使用async *函數(shù)從頭開(kāi)始創(chuàng)建流。

通過(guò)使用StreamController創(chuàng)建流逆航。



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市渔肩,隨后出現(xiàn)的幾起案子因俐,更是在濱河造成了極大的恐慌,老刑警劉巖周偎,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抹剩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蓉坎,警方通過(guò)查閱死者的電腦和手機(jī)澳眷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蛉艾,“玉大人钳踊,你說(shuō)我怎么就攤上這事∥鸷睿” “怎么了拓瞪?”我有些...
    開(kāi)封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)助琐。 經(jīng)常有香客問(wèn)我祭埂,道長(zhǎng),這世上最難降的妖魔是什么兵钮? 我笑而不...
    開(kāi)封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任蛆橡,我火速辦了婚禮,結(jié)果婚禮上掘譬,老公的妹妹穿的比我還像新娘泰演。我一直安慰自己,他們只是感情好屁药,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布粥血。 她就那樣靜靜地躺著,像睡著了一般酿箭。 火紅的嫁衣襯著肌膚如雪复亏。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天缭嫡,我揣著相機(jī)與錄音缔御,去河邊找鬼。 笑死妇蛀,一個(gè)胖子當(dāng)著我的面吹牛耕突,可吹牛的內(nèi)容都是我干的笤成。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼眷茁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼炕泳!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起上祈,我...
    開(kāi)封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤培遵,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后登刺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體籽腕,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年纸俭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了皇耗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡揍很,死狀恐怖郎楼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情女轿,我是刑警寧澤箭启,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站蛉迹,受9級(jí)特大地震影響傅寡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜北救,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一荐操、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧珍策,春花似錦托启、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蹭劈,卻和暖如春疗绣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铺韧。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工多矮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓塔逃,卻偏偏與公主長(zhǎng)得像讯壶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子湾盗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361