【dart学习】-- Dart之库的使用

(一)引用库

通过import语句在一个库中引用另外一个库的文件。需要注意以下事项

  • 在import语句后面需要接上库文件的路径
  • 对Dart语言提供的库文件使用dart:xx格式。
  • 对第三方提供的库文件使用package:xx格式。

import的例子如下:

import ‘dart:io‘;
import ‘package:mylib/mylib.dart‘;
import ‘package:utils/utils.dart‘;
void main(List<String> args){
}

(二)指定一个库的前缀(as关键词)

当引用的库拥有相互冲突的名字,可以为其中一个或者几个指定不一样的前缀。这与命名空间的概念比较接近

  • as关键字给库指定一个前缀:
    test2.dart代码
void hello() {
   print(‘test2.dart : hello()函数‘);
}  
  test3.dart代码如下:
void hello(){
  print(‘test3.dart : hello()函数‘);
}
  现在要在test1.dart中导入这两个文件:
//报错写法:
import ‘test2.dart‘;
import ‘test3.dart‘;

 //正确写法:
import ‘test2.dart‘;
import ‘test3.dart‘ as test3; // 给导入的库指定一个前缀 方便识别
//调用方式: void main(){    hello();//test2.dart : hello()函数    test3.hello();//test3.dart : hello()函数 }

总结
test1 与 test3 都拥有hello()函数重复的部分,如果直接引用就不知道具体引用哪一个hello(), 所以代码中用as关键词把 ‘test3.dart’指定成了 test3. 这样就不会冲突了。
      库与文件类,在引用时冲突的处理方法,和文件与方法在引用时冲突处理方法抑制。

(三)引用库的一部分(show,hide关键词)

  如果只想使用库的一部分,则可以有选择地导入库,可以使用show或者hide关键字。

  • show关键词: 表示仅导入当前库,
  • hide 关键词:表示除了当前库之外全部导入。
// 仅导入mylib.dart里面的test2函数
import ‘libs/mylib1.dart‘ show test2;
// 刚好和show相反 除了test2函数之外  其它的都导入
import ‘libs/mylib2.dart‘ hide test2;

(四)懒加载一个库

  延迟加载(也称为延迟加载)允许应用程序根据需要加载库,如果需要的话。以下是您可能使用延迟加载的一些情况:

  • 1).减少应用程序的初始启动时间。
  • 2).例如,执行A/B测试 - 尝试算法的替代实现。
  • 3).加载很少使用的功能,例如可选的屏幕和对话框。 要延迟加载库,必须先使用deferred as它导入一个库。当我们import一个库的时候,如果使用了as 不能同时使用deferred as
    例如:

    // import ‘libs/mylib.dart‘; // 不能同时使用
    import ‘libs/mylib.dart‘ deferred as tests;

    当您需要库时,使用库的标识符调用loadLibrary()。 例如(注意导包:import ‘dart:async‘;)

    Future hello() async {
      await tests.loadLibrary();
      tests.test2();
    }
    // 然后再去使用:
    void main(){
      hello(); // 结果是: mylib.dart:test2()函数
    }

  在上述的代码中,await关键字暂停执行,直到库被加载。 您可以在一个库上调用loadLibrary()多次,而不会出现问题。该库只加载一次。

  使用延迟加载时请记住以下内容:

  • 1).延迟库的常量不是导入文件中的常量。请记住,在加载延迟库之前,这些常量不存在。
  • 2).您不能在导入文件中使用延迟库中的类型。相反,请考虑将接口类型移动到由延迟库和导入文件导入的*库。
  • 3).Dart隐式插入loadLibrary()到你使用deferred as namespace定义的命名空间。loadLibrary()函数返回Future。

(五) 库的拆分

说明】dart官网不推荐使用part ,这个仅作为了解。 使用part指令,可以将库拆分为多个Dart文件。part of表示隶属于某个库的一部分。
  【注意事项

  • 1.不能同时使用library和part of,它们都用于指定属于库的内容。

    // library testlib2; 这个不能和part of同时使用 会报错
    // part of 表示这个库是testlib库的一部分
    part of testlib1;
    • B库是A库的一部分,在B库里面声明:part of A库名称 例如:在testlib2.dart里面声明 part of testlib1; 表示testlib2这个库是testlib库的yi部分。
    • 如果B库声明A库的一部分,同时A库也想声明它的一部分是B库,正确写法:B库声明part of A库名称,然后A库声明part ‘B库的路径‘ , 同时,如果B库没有声明,那么在A库里面使用part指令会报错。
      testlib1.dart内容:

      // 第1个库:
      library testlib1;
      // 可以不写
      part ‘testlib2.dart‘;
      void run() {
        print(‘testlib1库 : run()函数‘);
      }

      testlib2.dart内容:

      part of testlib1;
      class testLib2 {}
      void start() {
        print(‘testlib2库 : start()函数‘);
      }
    • B库声明了part of A库名称,A库可以省去声明part ‘B库的路径‘

      // 第1个库:
      library testlib1;
      // 可以不写
      part ‘testlib2.dart‘;

(六)库的自动导入

  • 在A库中使用export关键字引入B库,当我们使用A库的时候,会自动引入B库,也就是说我们导入了A库,就可以使用B库了。

    • mylib.dart内容为:

      // 这是一个库 命名为mylib
      library mylib;
      // 希望使用mylib的时候 自动使用otherlib.dart  可以使用export关键字引入其他库
      export ‘otherlib.dart‘;
      // 导入otherlib2.dart
      export ‘otherlib2.dart‘;
      
      class MyLib {
        void test() {
          print(‘mylib.dart: MyLib : test()函数‘);
        }
      }
      
      void test2() {
        print(‘mylib.dart: test2()函数‘);
      }
    • otherlib.dart库内容为:

      // otherlib库
      library otherlib;
      class otherLib {}
      void test() {
        print(‘otherLib库 : test()函数‘);
      }
    • otherlib2.dart库内容为:

      // otherlib2库
      library otherlib2;
      class otherLib2 {}
      void test2() {
        print(‘otherLib2库 : test2()函数‘);
      }

(七)库的组成结构

  • 库的最低要求是:pubspec.yaml文件和lib目录。
  • 库的pubspec.yaml文件与普通应用程序包的文件格式相同。
  • lib目录:库代码位于lib 目录下,并且对其他包是公共的。您可以根据需要在lib下创建任何层次结构。
  • 声明一个库的关键字是library。
  • 例如在文件test.dart文件首行加上:library mylib; 表示这个库的名称是mylib

原文地址:https://www.cnblogs.com/lxlx1798/p/11018884.html

时间: 2024-08-01 13:06:14

【dart学习】-- Dart之库的使用的相关文章

linux学习 建立静态库,动态库,写简单的makefile

建立静态库 建立四个文件 bin(可执行文件),lib(库),include(头文件),src(放源文件) 这里的起的库明为add 在src文件中执行 1)gcc -c add.c //编译add.c源文件生成add.o目标文件 2)ar crsv ../lib/ libadd.a add.o //对目标文件*.o进行归档,生成lib*.a, 把这个生成文件放在lib里 3)gcc -o main main.c -L(大些的爱偶,放库的路径)../lib   –l(小写的爱偶,库名为add) a

php学习笔记--GD库使用

php学习笔记--GD库使用 php培训教程中gd图片创建流程: 1).设定标头,告诉浏览器你要生成的MIME 类型. 2).创建一个图像区域,以后的操作都将基于此图像区域. 3).在空白图像区域绘制填充背景. 4).在背景上绘制图形轮廓输入文本. 5).输出最终图形. 6).清除所有资源. 7).其他页面调用图像. 合肥开源IT教育教学实例代码: header('Content-Type: image/png');  //设定标头指定MIME 输出类型 $im = imagecreate(20

【Dart学习】-- Dart之消息循环机制[翻译]

概述 异步任务在Dart中随处可见,例如许多库的方法调用都会返回Future对象来实现异步处理,我们也可以注册Handler来响应一些事件,如:鼠标点击事件,I/O流结束和定时器到期. 这篇文章主要介绍了Dart中与异步任务相关的消息循环机制,阅读完这篇文章后相信你可写出更赞的异步执行代码.你也能学习到如何调度Future任务并且预测他们的执行顺序. 在阅读这篇文章之前,你最好先要了解一下基本的Future用法. 基本概念 如果你写过一些关于UI的代码,你就应该熟悉消息循环和消息队列.有了他们才

【dart学习】-- Dart之函数

1. 指定返回值得函数 /** * 无返回值的函数 * params: 可以是任意类型(var和Object类型也可以任意类型). 当然这里的参数类型你可以随意指定我这里已dynamic为例 * 参数类型:你也可以指定var.Object等,再比如说你可以指定num, int,double, String.... * 如果我们对参数没有限制的话可以使用这个 */ void printDynamicParams(dynamic params){ print(params); } 主函数中我们调用p

【dart学习】-- Dart之基础语法

一,重要概念 所有你能够赋值给一个变量的都是一个对象,无论是变量,数字,函数等都是一个对象.所有的对象都是类的一个实例.所有的对象都继承自内置的Object类.这一点类似于Java语言“一切皆对象”. 虽然Dart是强类型语言,但是类型声明是可选项(即不是必须的),因为Dart可以自己去推断类型.这点与JS和Swift很类似.比如var number = 1,变量number就被推断为int类型.当你想明确说没有类型时,可以使用特殊类dynamic/object声明(详情下面会讲到). Dart

[dart学习]第六篇:流程控制语句

经过前面的基础知识了解学习,我们今天可以进入语句模块啦. dart主要有以下流程控制语句: if-else for循环 while和do-while循环 break和continue switch-case assert 当然,你还可以使用 try-catch或throw (一)if-else dart的if(或者else if)的条件表达式必须为bool表达式,不能使用其他类型.dart的if-else用法与C语言类似,不再细述. int a = 6; if(a<0) { print("

【Dart学习】--Dart之超级父类之Object

一,概述 -- Object Dart语言和Java一样,都是面向对象语言,所有的类也都有个公共的父类----->Object.该类位于Dart sdk核心库core目录下. 二,构造方法 //无参数构造方法. const Object(); 三,属性 //对象实例的哈希值,和Java中的一样 int hasCode //对象在运行时所属类型 Type runtimeType; 四,方法 //在通过该类的实例对象调用该类中不存在的属性或者方法时,会执行该方法,默认实现是抛出NoSuchMetho

【Dart学习】--之Iterable相关方法总结

一,概述 按顺序访问的值或元素的集合, List集合也是继承于Iterable List和Set也是Iterable,dart:collection库中同样有很多 部分Iterable集合可以被修改 向List或Set添加元素将改变对象所有包含的元素. 向Map添加新的Key会改变所有Map.keys的元素. 在集合改变后,创建的迭代器将提供新的所有元素,并且可能会保持目前元素的顺序, 也可能不会 二,创建方式 创建空的可迭代对象 var ite = Iterable.empty(); prin

Dart学习之基础语法

原文地址:https://www.jianshu.com/p/3d927a7bf020 基础数据类型 int,float,double,long,String,Map,List 基础数据类型的定义 动态类型 可以用var也可以用dynamic定义,如var value = 1,dynamic value = 1: 强类型定义 如:int s: final关键字 表示变量只能被赋值一次,赋值后不可再更改. const关键字 表示变量是编译时常量,const变量默认为final变量,const标志的