?dart:core - numbers, collections, strings, and more
此庫自動導入到每個Dart程序中。
print()方法一個參數(任何Object),并在控制臺中顯示該對象的字符串值(由toString()返回)。
數字
dart:core 庫定義了 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); //指定進制
// 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');
字符串程序構建:
var sb=StringBuffer();
sb
? ? ..write('Use a StringBuffer for ')
? ? ..writeAll(['efficient','string','creation'],' ')? //第二個參數是分隔符
? ? ..write('.');
var fullString=sb.toString();
字符串正則表達式:
// 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(); //動態類型
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));
可以自定義排序函數:此排序函數必須返回<0表示小于,0表示相同的值,> 0表示大于。
set支持集合運算
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()產生懶加載生成器對象,進行轉化
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紀元”(1970年1月1日,UTC)以來的毫秒數:
// 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
實現Comparable接口,以指示可以將一個對象與另一個對象進行比較,通常用于排序。 compareTo()方法對于較小的返回<0,對于相同的返回0,對于較大的返回> 0。
class Line implements Comparable<Line>{
final int length;
const Line(this.length);
@override
int compareTo(Line other)=>length-other.length;
}
Dart中的每個對象都會自動提供一個整數哈希碼,因此可以用作地圖中的鍵。 但是,您可以覆蓋hashCode getter以生成自定義哈希碼。 如果這樣做,您可能還想覆蓋==運算符。 相等的對象(通過==)必須具有相同的哈希碼。
Iterable和Iterator類支持for-in循環。 每當您創建一個可以提供for循環中使用的Iterator的類時,就擴展(如果可能)或實現Iterable。 實現Iterator定義實際的迭代能力。
自定義異常
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();});
如果只關心一個事件,則可以使用諸如first,last或single這樣的屬性來獲取它。 要在處理事件之前對其進行測試,請使用諸如firstWhere(),lastWhere()或singleWhere()之類的方法。如果您關心事件的子集,則可以使用諸如skip(),skipWhile(),take(),takeWhile()和where()之類的方法。
var lines=inputStream.transform(utf8.decoder).transform(LineSplitter()); //流轉換
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庫提供了常用功能(例如正弦和余弦,最大值和最小值)以及常數(例如pi和e)。數學庫中的大多數功能都實現為頂級函數。
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(帶有字符串鍵)的對象才能直接編碼為JSON。 List和Map對象是遞歸編碼的。
您可以使用兩種方法對無法直接編碼的對象進行編碼。 第一種是使用encode()的第二個參數:一個函數,該函數返回可直接編碼的對象。 您的第二個選擇是忽略第二個參數,在這種情況下,編碼器將調用對象的toJson()方法。
使用utf8.decode()將UTF8編碼的字節解碼為Dart字符串:
var funnyWord=utf8.decode(utf8Bytes);
var lines = utf8.decoder.bind(inputStream).transform(LineSplitter());? //流的轉換,結果還是流數據
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';
使用頂級函數querySelector()和querySelectorAll()查找一個或多個元素。 您可以按?ID, class, tag, name,或它們的任意組合進行查詢。 CSS選擇器規范指南定義了選擇器的格式,例如使用#前綴指定元素ID以及使用.指定元素的類的ID。
querySelector()函數返回與選擇器匹配的第一個元素,而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庫實現并提升了異步API。 同步方法很容易阻塞應用程序,從而難以擴展。 因此,大多數操作都是通過Future或Stream對象返回結果的。
dart:io庫中的一些同步方法在方法名稱上明顯帶有Sync后綴。
import? 'dart:io';
I / O庫使命令行應用程序可以讀取和寫入文件以及瀏覽目錄。 您有兩種選擇來讀取文件的內容:一次全部或流式傳輸。 一次讀取一個文件需要足夠的內存來存儲文件的所有內容。 如果文件很大,或者您想在讀取文件時對其進行處理,則應使用流,如流文件內容中所述。
var config=File('config.txt');
contents=await config.readAsString(); //整個文本
contents=await config.readAsLines();//按行
?contents=awaitconfig.readAsBytes();//二進制
流讀取
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 :寫二進制數據
查找目錄的所有文件和子目錄是異步操作。 list()方法返回一個Stream,當遇到文件或目錄時該Stream發出一個對象。
File和Directory類包含其他功能,包括但不限于:
創建文件或目錄:文件和目錄中的create()
刪除文件或目錄:“文件和目錄”中的delete()
獲取文件的長度:File中的length()
隨機訪問文件:File中的open()
var file = File(Platform.script.toFilePath()); //當前文件
dart:async庫包含對許多Dart API很重要的兩種類型:Stream和Future。 如果Future表示單個計算的結果,則流是一系列結果。 您偵聽流以獲取有關結果(數據和錯誤)以及流關閉的通知。 您還可以在收聽流時暫停播放或在流完成之前停止收聽。
幾種方式創建流:
改造現有流。
通過使用async *函數從頭開始創建流。
通過使用StreamController創建流。