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