用 library 来来命名库,用part来指定库中的其他文件。 注意:不必在应用程序中(具有顶级main()函数的文件)使用library,但这样做可以让你在多个文件中执行应用程序。
声明库
利用library identifier(库标识符)指定当前库的名称:
// 声明库,名ballgame library ballgame; // 导入html库 import 'dart:html'; // ...代码从这里开始...
关联文件与库
添加实现文件,把part fileUri放在有库的文件,其中fileURI是实现文件的路径。然后在实现文件中,添加部分标识符(part of identifier),其中标识符是库的名称。下面的示例使用的一部分,在三个文件来实现部分库。
第一个文件,ballgame.dart,声明球赛库,导入其他需要的库,并指定ball.dart和util.dart是此库的部分:
library ballgame; import 'dart:html'; // ...其他导入在这里... part 'ball.dart'; part 'util.dart'; // ...代码从这里开始...
第二个文件ball.dart,实现了球赛库的一部分:
part of ballgame; // ...代码从这里开始...
第三个文件,util.dart,实现了球赛库的其余部分:
part of ballgame; // ...Code goes here...
重新导出库(Re-exporting libraries)
*可以通过重新导出部分库或者全部库来组合或重新打包库。例如,你可能有实现为一组较小的库集成为一个较大库。或者你可以创建一个库,提供了从另一个库方法的子集。
// In french.dart: library french; hello() => print('Bonjour!'); goodbye() => print('Au Revoir!'); // In togo.dart: library togo; import 'french.dart'; export 'french.dart' show hello; // In another .dart file: import 'togo.dart'; void main() { hello(); //print bonjour goodbye(); //FAIL }
异步的支持
Dart 添加了一些新的语言特性用于支持异步编程。最通常使用的特性是 async 方法和 await 表达式。Dart 库大多方法返回 Future 和 Stream 对象。这些方法是异步的:它们在设置一个可能的耗时操作(比如 I/O 操作)之后返回,而无需等待操作完成
当你需要使用 Future 来表示一个值时,你有两个选择。
使用 async 和 await
使用 Future API
同样的,当你需要从 Stream 获取值的时候,你有两个选择。
使用 async 和一个异步的 for 循环 (await for) 使用 Stream API
使用 async 和 await 的代码是异步的,不过它看起来很像同步的代码。比如这里有一段使用 await 等待一个异步函数结果的代码:
await lookUpVersion()
要使用 await,代码必须用 await 标记
checkVersion() async { var version = await lookUpVersion(); if (version == expectedVersion) { // Do something. } else { // Do something else. } }
你可以使用 try, catch, 和 finally 来处理错误并精简使用了 await 的代码。
try { server = await HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 4044); } catch (e) { // React to inability to bind to the port... }
声明异步函数
一个异步函数是一个由 async 修饰符标记的函数。虽然一个异步函数可能在操作上比较耗时,但是它可以立即返回-在任何方法体执行之前。
checkVersion() async { // ... } lookUpVersion() async => /* ... */;
在函数中添加关键字 async 使得它返回一个 Future,比如,考虑一下这个同步函数,它将返回一个字符串。
String lookUpVersionSync() => '1.0.0';
如果你想更改它成为异步方法-因为在以后的实现中将会非常耗时-它的返回值是一个 Future 。
Future lookUpVersion() async => '1.0.0';
请注意函数体不需要使用 Future API,如果必要的话 Dart 将会自己创建 Future 对象
使用带 future 的 await 表达式
一个 await表达式具有以下形式
await expression
在异步方法中你可以使用 await 多次。比如,下列代码为了得到函数的结果一共等待了三次。