库
import 和 library 关键字可以帮助你创建一个模块化和可共享的代码库。代码库不仅只是提供 API 而且还起到了封装的作用:以下划线(_)开头的成员仅在代码库中可见。
每个 Dart 程序都是一个库,即便没有使用关键字 library 指定。
使用库
使用 import 来指定命名空间以便其它库可以访问。
例如 import 'dart:html';
import 的唯一参数是用于指定代码库的 URI,对于 Dart 内置的库,使用 dart:xxxxxx 的形式。而对于其它的库,你可以使用一个文件系统路径或者以 package:xxxxxx 的形式。 package:xxxxxx 指定的库通过包管理器(比如 pub 工具)来提供:
import 'package:test/test.dart';
指定库前缀
如果你导入的两个代码库有冲突的标识符,你可以为其中一个指定前缀。比如如果 library1 和 library2 都有 Element 类,那么可以这么处理:
指定库前缀 导入库的一部分
如果你只想使用代码库中的一部分,你可以有选择地导入代码库:
导入库的一部分延迟加载库
延迟加载(也常称为 懒加载)允许应用在需要时再去加载代码库,下面是可能使用到延迟加载的场景:
为了减少应用的初始化时间;
处理 A/B 测试,比如测试各种算法的不同实现;
加载很少会使用到的功能,比如可选的屏幕和对话框。
使用 deferred as 关键字 来标识需要 延时加载 的代码库:
import 'package:greetings/hello.dart' deferred as hello;
当实际需要使用到库中 API 时先调用 loadLibrary 函数加载库:
使用 await 关键字 暂停代码执行 直到库加载完成;
loadLibrary 函数可以调用多次也没关系,代码库 只会被加载一次 (和 js 中 require 类似)。
注意:
当你使用延迟加载的时候需要牢记以下几点:
1 延迟加载的代码库中的常量需要在代码库被加载的时候才会导入,未加载时是不会导入的;
2 导入文件的时候无法使用延迟加载库中的类型。如果你需要使用类型,则考虑把接口类型转移到另一个库中然后让两个库都分别导入这个接口库;
3 Dart会隐式地将 loadLibrary() 导入到使用了 deferred as 命名空间 的类中。 loadLibrary() 函数返回的是一个 Future。
异步支持
Dart 代码库中有大量返回 Future 或 Stream 对象的函数,这些函数都是异步的,它们会在耗时操作(比如I/O)执行完毕前直接返回而不会等待耗时操作执行完毕。
async 和 await 关键字用于实现异步编程,并且让你的代码看起来就像是同步的一样(同 JS)。
Future
在 Dart 库中随处可见 Future 对象,通常异步函数返回的对象就是一个 Future。当一个 future完成执行后,future 中的值就已经可以使用了, 如何使用 future 的值(和 JS 类似):
1 使用 async 和 await;
async 和 awaitasync 函数能够捕获来自 Future 的异常;
2 使用 Future API, then 语法;
then使用 catchError() 来处理一些 Future 对象可能抛出的错误或者异常;
then().catchError() 组合是 try-catch 的异步版本。
then().catchError()链式异步编程
then() 方法返回一个 Future 对象,这样就提供了一个非常好的方式让多个异步方法按顺序依次执行。如果用 then() 注册的回调返回一个 Future ,那么 then() 返回一个等价的 Future 。如果回调返回任何其他类型的值,那么 then() 会创建一个以该值完成的新 Future;
同 JS
等待多个 Future
类似 promise.all
等待多个 FutureStream
在 Dart API 中 Stream 对象随处可见,Stream 用来表示一系列数据。例如,HTML 中的按钮点击就是通过 stream 传递的。同样也可以将文件作为数据流来读取。
异步循环
它使用 Stream 的 listen() 方法来订阅文件列表,传入一个搜索文件或目录的函数;
listen有时,可以使用异步 for 循环 await for ,来替代 Stream API 。
await for监听流数据(stream data)
使用 await for 或者使用 listen() 方法监听 stream,来获取每个到达的数据流值:
监听流数据传递流数据(stream data)
在使用流数据前需要改变数据的格式,使用 transform() 方法生成具有不同类型数据的流:
传递流数据如果使用的是 Stream API,那么通过注册 onError 监听来处理错误。代码位于注册的 onDone 中,会在 stream 被关闭后执行;
onError
网友评论