Dart15库

1.导入和使用库

以下示例导入内置库 dart:math,示例代码是从 math 库中调用 sqrt() 函数,此函数返回传递给它的数字的平方根。

import 'dart:math'; 
void main() { 
   print("Square root of 36 is: ${sqrt(36)}"); 
}

执行上面示例代码,得到以下结果:

Square root of 36 is: 6.0

2.常用库

类库说明
dart:io服务器应用程序的文件,套接字,HTTP和其他I/O支持。此库在基于浏览器的应用程序中不起作用。默认情况下会导入此库。
dart:core每个Dart程序的内置类型,集合和其他核心功能。默认情况下会导入此库。
dart:math数学常数和函数,随机数生成器。
dart:convert用于在不同数据表示之间进行转换的编码器和解码器,包括JSON和UTF-8。
dart:typed_data有效处理固定大小数据的列表(例如,无符号8字节整数)。

3.创建自定义库

Dart还可以将自己的代码用作为库,创建自定义库涉及以下步骤:

  • 第1步:声明库
library library_name  
// library contents go here
  • 第2步:关联库
import '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

4.库前缀

如果导入两个存在冲突标识符的库, 则可以为这两个库,或者其中一个指定前缀。

首先,定义一个库: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

5.导入库的一部分

如果你只使用库的一部分功能,则可以选择需要导入的 内容。例如:

// Import only foo.
import 'package:lib1/lib1.dart' show foo;

// Import all names EXCEPT foo.
import 'package:lib2/lib2.dart' hide foo;

6.延迟加载库

Deferred loading (也称之为 lazy loading) 可以让应用在需要的时候再加载库。 下面是一些使用延迟加载库的场景:

  • 减少 APP 的启动时间。
  • 执行 A/B 测试,例如 尝试各种算法的 不同实现。
  • 加载很少使用的功能,例如可选的屏幕和对话框。

要延迟加载一个库,需要先使用 deferred as 来导入:

import 'package:greetings/hello.dart' deferred as hello;

当需要使用的时候,使用库标识符调用 loadLibrary() 函数来加载库:

Future greet() async {
  await hello.loadLibrary();
  hello.printGreeting();
}

在一个库上你可以多次调用 loadLibrary() 函数。但是该库只是载入一次。

7.第三方库

包是一种封装一组编程单元的机制,应用程序有时可能需要集成某些第三方库或插件。每种语言都有一种机制来管理外部软件包,如Maven或Gradle for Java、npm for Node.js等,Dart 的软件包管理器是 pub。

Pub有助于在存储库中安装包,托管软件包的存储库可以在 https://pub.dartlang.org/ 找到。

包元数据在文件 pubsec.yaml 中定义,每个 Dart 应用程序都有一个 pubspec.yaml 文件,其中包含对其他库的应用程序依赖性以及应用程序的元数据,如应用程序名称、作者、版本和描述。

pubspec.yaml 文件的内容应该如下所示:

name: DartStudy 
version: 0.0.1 
description: 这是我的第一个dart程序
environment:
  sdk: '>=2.10.0 <3.0.0'
dependencies: 
  http: ^0.13.5

7.1.pub 命令

pub 的一些重要命令如下:

命令描述
pub get获取应用程序所依赖的所有包。
pub upgrade将所有依赖项升级到较新版本。
pub build用于构建您的Web应用程序,它将创建一个构建文件夹,其中包含所有相关脚本。
pub help将提供所有pub命令的帮助。

以下示例使用一个http第三方库,请求网络

import 'dart:convert' as convert;
import 'package:http/http.dart' as http;

void main(List<String> arguments) async {
  // This example uses the Google Books API to search for books about http.
  // https://developers.google.com/books/docs/overview
  var url =
      Uri.https('www.googleapis.com', '/books/v1/volumes', {'q': '{http}'});

  // Await the http get response, then decode the json-formatted response.
  var response = await http.get(url);
  if (response.statusCode == 200) {
    var jsonResponse =
        convert.jsonDecode(response.body) as Map<String, dynamic>;
    var itemCount = jsonResponse['totalItems'];
    print('Number of books about http: $itemCount.');
  } else {
    print('Request failed with status: ${response.statusCode}.');
  }
}

7.2.pubspec.yaml 字段详情

  • Name

name 表示的是包的名字,name 必须是全小写,如果有多个词的话,可以用下划线来区分,如:my_app。并且只能使用小写字母和数字的组合,同时不能以数字开头,并且不要使用 dart 中的保留字。

  • Version

Version表示的是版本号,版本号是由点分割的三个数字,如:11.15.0. 后面还可以跟上build版本号:+1, +2, +hotfix.oopsie, 或者预发布版本等:-dev.4、-alpha.12、-beta.7、-rc.5。

  • Description

package 的描述信息最好使用英文来描写,长度是60 到180个字符,表示这个包的作用。

  • Dependencies

有两种依赖信息,一种是所有使用到这个packages的人都需要用到的依赖,这种依赖放在dependencies中。还有一种是只用在当前

pacakge开发中的包,这种依赖放在dev_dependencies中。

在某些情况下,我们有可能需要覆盖某些依赖包,则可以放在:dependency_overrides中。

  • environment

因为 Dart 是一门新的语言,所以目前来说其变动还是挺大的。所以有些应用可以依赖于不同的 dart 版本,这时候就需要用到environment:

environment:
  sdk: '>=2.10.0 <3.0.0'

上面的代码中,我们指定了dart sdk的版本范围。