Dart程式設計 - 庫



程式語言中的庫表示一系列例程(一組程式設計指令)。Dart具有一組內建庫,這些庫可用於儲存常用例程。Dart庫包含一組類、常量、函式、typedef、屬性和異常。

匯入庫

匯入使庫中的元件可用於呼叫程式碼。import關鍵字用於實現此目的。一個Dart檔案可以有多個import語句。

內建Dart庫URI使用dart:模式來引用庫。其他庫可以使用檔案系統路徑或package:模式來指定其URI。由包管理器(例如pub工具)提供的庫使用package:模式

在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:261) 
#3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)

建立自定義庫

Dart還允許您使用自己的程式碼作為庫。建立自定義庫包括以下步驟:

步驟1:宣告庫

要顯式宣告庫,請使用library語句。宣告庫的語法如下:

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 
廣告