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创建流。



©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352