Dart-核心庫

?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創建流。



?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。