Dart库
编程语言中的库表示例程集合(编程指令集)。Dart有一组内置库,可用于存储经常使用的例程。Dart库包含一组类,常量,函数,typedef,属性和异常。
导入库
导入使库中的组件可用于调用者代码。import
关键字用于实现相同的目标。dart文件可以有多个import
语句。
内置Dart库URI使用dart:scheme
来引用库。其他库可以使用文件系统路径或package:scheme
来指定其URI。包管理器(如pub工具)提供的库使用package:scheme
。
下面给出了在Dart中导入库的语法 -
import 'URI'
阅读以下代码段 -
import 'dart:io'
import 'package:lib1/libfile.dart'
如果只想使用库的一部分,则可以有选择地导入库。语法如下所示 -
import 'package: lib1/lib1.dart' show foo, bar;
// Import only foo and bar.
import 'package: mylib/mylib.dart' hide foo;
// Import all names except foo
下面给出了一些常用的库 -
编号 | 类库 | 说明 |
---|---|---|
1 | dart:io |
服务器应用程序的文件,套接字,HTTP和其他I/O支持。此库在基于浏览器的应用程序中不起作用。默认情况下会导入此库。 |
2 | dart:core |
每个Dart程序的内置类型,集合和其他核心功能。默认情况下会导入此库。 |
3 | dart:math |
数学常数和函数,随机数生成器。 |
4 | dart:convert |
用于在不同数据表示之间进行转换的编码器和解码器,包括JSON和UTF-8。 |
5 | dart:typed_data |
有效处理固定大小数据的列表(例如,无符号8 字节整数)。 |
示例:导入和使用库
以下示例导入内置库dart:math
。示例代码是从math
库中调用sqrt()
函数。此函数返回传递给它的数字的平方根。
import 'dart:math';
void main() {
print("Square root of 36 is: ${sqrt(36)}");
}
执行上面示例代码,得到以下结果 -
Square root of 36 is: 6.0
封装库
Dart脚本可以使用下划线(_
)为标识符添加前缀,以将其组件标记为私有。简而言之,Dart库可以通过外部脚本限制对其内容的访问,它称为封装。下面给出了相同的语法 -
语法
_identifier
示例
首先,使用私有函数定义库。
library loggerlib;
void _log(msg) {
print("Log method called in loggerlib msg:$msg");
}
接下来,导入库 -
import 'test.dart' as web;
void main() {
web._log("hello from webloggerlib");
}
执行上面示例代码,将会输出以下错误 -
Unhandled exception:
No top-level method 'web._log' declared.
NoSuchMethodError: method not found: 'web._log'
Receiver: top-level
Arguments: [...]
#0 NoSuchMethodError._throwNew (dart:core-patch/errors_patch.dart:184)
#1 main (file:///C:/Users/Administrator/WebstormProjects/untitled/Assertion.dart:6:3)
#2 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:161)
#3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:98)
创建自定义库
Dart还可以将自己的代码用作为库,创建自定义库涉及以下步骤 -
第1步:声明库
要显式声明库,请使用库语句。声明库的语法如下所示 -
library library_name
// library contents go here
第2步:关联库
可以通过两种方式关联库 -
在同一目录中
import 'library_name'
在不同的目录中
import 'dir/library_name'
示例:自定义库
首先,定义一个自定义库 - calculator.dart
。
library calculator_lib;
import 'dart:math';
//import statement after the libaray statement
int add(int firstNumber,int secondNumber){
print("inside add method of Calculator Library ") ;
return firstNumber+secondNumber;
}
int modulus(int firstNumber,int secondNumber){
print("inside modulus method of Calculator Library ") ;
return firstNumber%secondNumber;
}
int random(int no){
return new Random().nextInt(no);
}
接下来,导入上面自定的库 -
import 'calculator.dart';
void main() {
var num1 = 10;
var num2 = 20;
var sum = add(num1,num2);
var mod = modulus(num1,num2);
var r = random(10);
print("$num1 + $num2 = $sum");
print("$num1 % $num2= $mod");
print("random no $r");
}
执行上面示例代码,得到以下结果 -
inside add method of Calculator Library
inside modulus method of Calculator Library
10 + 20 = 30
10 % 20= 10
random no 0
库前缀
如果导入两个具有冲突标识符的库,则可以为一个或两个库指定前缀。使用as
关键字指定前缀。以下语法 -
import 'library_uri' as prefix
示例
首先,定义一个库:loggerlib.dart
,代码如下所示 -
library loggerlib;
void log(msg){
print("Log method called in loggerlib msg:$msg");
}
接下来,将定义另一个库:webloggerlib.dart
,代码如下所示 -
library webloggerlib;
void log(msg){
print("Log method called in webloggerlib msg:$msg");
}
最后,导入带有前缀的库。
import 'loggerlib.dart';
import 'webloggerlib.dart' as web;
// prefix avoids function name clashes
void main(){
log("hello from loggerlib");
web.log("hello from webloggerlib");
}
执行上面示例代码,得到以下结果 -
Log method called in loggerlib msg:hello from loggerlib
Log method called in webloggerlib msg:hello from webloggerlib