編程語言中的庫表示例程集合(編程指令集)。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