?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í)際的迭代能力。
自定義異常
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)建流逆航。