Dart 编程 - 库

编程语言中的库表示例程集合(编程指令集)。Dart 有一组内置库,可用于存储经常使用的例程。Dart 库由一组类、常量、函数、类型定义、属性和异常组成。

导入库

导入使调用者代码可以使用库中的组件。使用 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;
// 仅导入 foo 和 bar。

import 'package: mylib/mylib.dart' hide foo;
// 导入除 foo 之外的所有名称

下面给出一些常用的库 −

Sr.No 库和说明
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("36 的平方根是:${sqrt(36)}");
}

输出

36 的平方根为: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
// 库内容在此处显示

步骤 2:关联库

您可以通过两种方式关联库 −

  • 在同一目录中
import 'library_name'
  • 来自不同的目录
import 'dir/library_name'

示例:自定义库

首先,让我们定义一个自定义库,calculator.dart

library calculator_lib;  
import 'dart:math'; 

//库语句之后的导入语句
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;  

// 前缀避免函数名称冲突
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