当前位置: 首页 > 工具软件 > URI.Dart > 使用案例 >

Dart中的库

松铭
2023-12-01
  • 库的种类

  • 导入库

  • 封装库

  • 创建自定义库

  • 库前缀

  • 其他

一. 库的种类

Dart中的库主要有三种:系统库、自定义库、第三方库

1.我们自定义的库
    import 'lib/xxx.dart';
2.系统内置库
    import 'dart:math';    
    import 'dart:io'; 
    import 'dart:convert';
3.Pub包管理系统中的库
    https://pub.dev/packages
    https://pub.flutter-io.cn/packages
    https://pub.dartlang.org/flutter/
    1、需要在自己想项目根目录新建一个pubspec.yaml
    2、在pubspec.yaml文件 然后配置名称 、描述、依赖等信息
    3、然后运行 pub get 获取包下载到本地  
    4、项目中引入库 import 'package:http/http.dart' as http; 
    5、看文档使用
二. 导入库
1. 完全导入

假如我们需要在A库里使用B库的某些方法,我们需要将B库import进A库。

import 'B.dart';

import关键字用于实现相同的目标。dart文件可以有多个import语句。
内置DartURI使用dart:scheme来引用库。其他库可以使用文件系统路径或package:scheme来指定其URI。包管理器(如pub工具)提供的库使用package:scheme

import'package:hello/hello.dart';
2.不完全导入

Dart提供了额外的机制来控制导入到库内的对象:命名组合器show和hide。

A. show

当只需要一个庞大库中某一个或某几个(少数)的对象的时候,可以选择使用show组合器进行导入。

import 'package:math' show Random;

在这行代码中,只导入了math库中的Random对象。
show组合器接收一个命名空间和一个标识符列表,并将标识符列表中出现的对象保留在命名空间。

B. hide

当在一个库种希望不导入某一个或某几个对象的时候,可以使用hide组合器进行导入。

import 'package:math' hide Random;

这段代码将导入math库但不导入math库种的Random对象。实现方式与show类似。同样也是接收一个命名空间和标识符列表,并将标识符列表中出现的对象从命名空间中丢弃,然后产生一个新的命名空间。

3. 延迟加载

延迟加载,也称为懒加载,可以在需要的时候再进行加载。
懒加载的最大好处是可以减少APP的启动时间。
懒加载使用deferred as关键字来指定,例如:

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

greet() async
{
    await hello.loadLibrary();
    hello.printGreeting();
}
4. 常用的库
编号类库说明
1dart:io服务器应用程序的文件,套接字,HTTP和其他I/O支持。此库在基于浏览器的应用程序中不起作用。默认情况下会导入此库。
2dart:core每个Dart程序的内置类型,集合和其他核心功能。默认情况下会导入此库。
3dart:math数学常数和函数,随机数生成器。
4dart:convert用于在不同数据表示之间进行转换的编码器和解码器,包括JSON和UTF-8。
5dart:typed_data有效处理固定大小数据的列表(例如,无符号8字节整数)。
5. 使用库实例
import 'dart:math'; 
void main()
{ 
    print("Square root of 36 is: ${sqrt(36)}");

	// 运行结果:
	// Square root of 36 is: 6.0
}
三. 封装库

Dart可以使用下划线(_)为标识符添加前缀,以将其组件标记为私有。简而言之,Dart库可以通过外部脚本限制对其内容的访问,称为封装。

1.首先,使用私有函数定义库。
library logger_lib;

void log(String msg)
{
    print("Log method called in logger_lib msg:$msg");
}

void _log1(String msg)
{
    print("Log1 method called in logger_lib msg:$msg");
}
2.导入库
import 'lib/logger_lib.dart' as logLib;

void main()
{
    logLib.log("hello dart!");          // Log method called in logger_lib msg:hello dart!
    logLib._log1("hello dart!");        // Error: Method not found: '_log1'.
}
四. 创建自定义库
1. 声明库

要显式声明库,请使用库语句。声明库的语法如下:

library library_name;
2. 关联库

可以通过两种方式关联库:

  • 在同一目录中:
import 'library_name';
  • 在不同的目录中:
import 'dir/library_name';
3. 实例
  • 定义一个自定义库:logger_lib.dart
library logger_lib;

void log(String msg)
{
    print("Log msg:$msg");
}
  • 导入自定义的库
import 'lib/logger_lib.dart';

void main()
{
    log("hello dart!");          // Log msg:hello dart!
}
五. 库前缀

如果导入两个具有冲突标识符的库,则可以为一个或两个库指定前缀。使用as关键字指定前缀。

1. 定义一个自定义库:logger_lib.dart
library logger_lib;

void log(String msg)
{
    print("Log method called in logger_lib msg:$msg");
}
2. 定义另一个自定义库:other_logger_lib.dart
library other_logger_lib;

void log(String msg)
{
    print("Log method called in other_logger_lib msg:$msg");
}
3. 导入带有前缀的库
import 'lib/logger_lib.dart';
import 'lib/other_logger_lib.dart' as other_lib;

void main()
{
    log("hello dart!");             // Log method called in logger_lib msg:hello dart!
    other_lib.log("hello dart!");   // Log method called in other_logger_lib msg:hello dart!
}
六. 其他:
1. asyncawait

这两个关键字的使用只需要记住两点:

1. 只有async方法才能使用await关键字调用方法.
2. 如果调用别的async方法必须使用await关键字.
3. async是让方法变成异步。
4. await是等待异步方法执行完成。
void main() async
{
    var result = await testAsync();
    print(result);  // Hello async

}

// 异步方法
testAsync() async
{
    return 'Hello async';
}
2. 库的拆分partpart of

有的时候一个库可能太大,不能方便的保存在一个文件当中。Dart允许我们把一个库拆分成一个或者多个较小的part组件。或者我们想让某一些库共享它们的私有对象的时候,我们需要使用part

  • 1.定义一个自定义类:util.dart
library util;
import 'dart:math';

part 'logger.dart';
part 'calculator.dart';
  • 2.定义logger.dart中的方法:
part of util;

void log(String msg)
{
    print("Log msg:$msg");
}
  • 3.定义calculator.dart中的方法:
part of util;

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);
}
  • 4.使用
import 'lib/util.dart';

void main() async
{
    log("hello dart!");     // 调用util中的log方法,结果为:Log msg:hello dart!

    print(add(12, 34));     // 调用util中的add方法,结果为:46
}

注意:

1. part各文件是互知存在的,是一个整体,所有对象是共享的(各部分不许重复引入)
2. 实际使用单个方法时必须引入整体的那个模块(本例子中的整体模块为util.dart)
3. 库的导出export

多个较小的库组合为一个较大的库或者重新导出库的一部分作为一个新的库

export各文件是互相不可见的,如果在A库中export了B库、C库,A库是包含B、C库的全部的。

  • 1.定义logger.dart
library logger;

void log(String msg)
{
    print("Log msg:$msg");
}
  • 2.定义calculator.dart
library calculator.dart;
import 'dart:math';

int add(int firstNumber, int secondNumber)
{
    return firstNumber + secondNumber;
}

int modulus(int firstNumber, int secondNumber)
{
    return firstNumber % secondNumber;
}

int random(int no)
{
    return new Random().nextInt(no);
}
  • 3.定义util.dart
library util;

export 'calculator.dart';
export 'logger.dart';
  • 4.使用
import 'lib/util.dart';

void main() async
{
    log("hello dart!");     // 调用util中的log方法,结果为:Log msg:hello dart!

    print(add(12, 34));     // 调用util中的add方法,结果为:46
}
 类似资料: