Dart | 浅析dart中库的导入与拆分

待兔 等级 820 1 0
标签: dartDart

前言

最近十分热门的跨平台框架使用了一门比较生僻的编程语言dart。dart语言本身深受早期一些编程语言的影响。特别是Smalltalk,Java和JavaScript。我是从Java语言向dart过度的,一开始感觉很不错,快速就对这门语言有了一个初步的认识,并能够写小段代码了。

但在flutter的不断学习过程中,我遇到了不少因为dart的一些语法而产生的困惑。回过头来看dart的语法之后产生了一些顿悟,在此记录下来希望能帮助到更多的学习者。

你将学到什么

  • 外部库的完全导入与不完全导入
  • 导入新的库对变量命名空间的影响
  • 库的拆分——part

导入

完全导入

我们假定需要在A库里使用B库的某些方法,我们需要将B库import进A库。这是我们十分熟悉的。

import 'B.dart'; 

不仅如此,dart的导入语句还适用于任意url。我们可以使用网络上的某个资源(dart文件)作为外部库导入。

import 'http://hello/hello.dart'; 

但是我们不推荐这样做。因为网络资源随时可能会发生变化。一旦改变,我们的程序将会被破坏。

真正严谨的做法是:

import'package:hello/hello.dart'; 

使用 package:导入方式会执行一个常驻的封装了代码位置信息的包管理器。

一个库可以使用的全部对象包括这个库本身声明的,以及通过导入语句从其他库导入的。在dart:core中定义的对象是隐式导入的。而一个库对外可使用的对象称为库导出的命名空间。

理论上一个库的命名空间中不应有名称相同的两个对象,否则你需要使用别名。

import 'test2.dart'
class Test{
    static final hello = new Test();
} 

class Test2{ static final hello = new Test2(); Test2 _test = new Test2(); }


在这段代码中,Test2被import进了Test库,我们在test库中是无法看到Test2的私有变量\_test的,所以这个变量将不会被导入到命名空间。

在Dart中,当前库所声明的对象优先级高于任何对象,因此导入的库中有顶层对象并不会有想象中那样具有破坏性。但是如果你访问了一个导入的对象,另外一个导入后续又添加了一个同名对象,那么新导入的对象会覆盖原有对象。

不完全导入
-----

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

### show

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

import 'package:math' show Random;


在这行代码中,我们只导入了math库中的Random对象。

show组合器接收一个命名空间和一个标识符列表,并将标识符列表中出现的对象保留在命名空间。

### hide

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

import 'package:math' hide Random;


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

### 解决变量名冲突的办法

解决此问题最好的办法是将引入的库加上别名。

import 'package:math' as mymath;


通过这种方式我们可以完美避开不同库之间因为导入而使得变量名冲突的问题。

库的拆分
----

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

![](https://img-hello-world.oss-cn-beijing.aliyuncs.com/3c031737d6009cf845a82d0be4db0f18.png)

image

![](https://img-hello-world.oss-cn-beijing.aliyuncs.com/fa33b5f1a30c3cfa1608cfa4533aec91.png)

image



这里我们可以看到,parttest2.dart是part of 'parttest.dart'的文件,可以理解为,parttest2是parttest的一部分。在part test2.dart中,我们并没有引入package:flutter/material.dart包就直接继承了StatelessWidget,是因为,在part中,import进来的库是共享命名空间的。

不是所有的库都有名称,但如果使用part来构建库,那么库必须要命名。

library xxx;

```

每个子part都存放在各自的文件中。但是它们共享同一作用域,库的内部命名空间,以及所有的导入(import)。

在上述例子中,我们可以看到,part data.dart中Data类中调用了part data.g.dart的DataFromJson(json)方法,而第二个part中构建DataFromJson(json)方法返回Data对象并没有在part data.g.dart定义。它们彼此之间是共用的命名空间。并且私有对象也是可以互相访问的。

part也可以通过url指明它所在的库,但是我们同样也是不推荐这样做的。

Part与import有什么区别

可见性:
如果说在A库中import了B库,A库对B库是不可见的,也就是说B库是无法知道A库的存在的。而part的作用是将一个库拆分成较小的组件。两个或多个part共同构成了一个库,它们彼此之间是知道互相的存在的。

作用域:import不会完全共享作用域,而part之间是完全共享的。如果说在A库中import了B库,B库import了C库,A库是没有办法直接使用C库的对象的。而B,C若是A的part,那么三者共享所有对象。并且包含所有导入。

写在最后

以上就是Dart中库的导入与拆分的全部内容,若有描述不准确或错误之处欢迎各位大牛指正。

收藏
评论区

相关推荐

[Dart]Dart语言之旅<一>:简介
我们假定你已经知道如何用另一种语言编程,《Dart语言之旅》将向你展示了如何使用每个主要的Dart特性——从变量和运算符到类和库。 一个基本的Dart程序 下面的代码使用了许多Dart最基本的功能: // Define a function. printNumber(num aNumber) { print('The number is $a
IDEA 配置 Dart 开发环境,以及创建第一个 Dart 项目
IDEA 配置 Dart 开发环境,以及创建第一个 Dart 项目 1、打开 IDEA 会看到如下页面,点击右下角的 Configure,然后点击 Plugins Launch Page 2、在新打开的页面中搜索 Dart,可以看到如下的搜索结果,然后点击右侧面板的 insta
Dart官方文档翻译(一)(Dart之旅)
这篇文章将会向你展示如何使用Dart的每一个知识点,包括变量,操作符,类,类库,但这是在你已经有一个其他语言的编码经验的前提下。 为了学习Dart更多关于Dart的核心类库,请查看A Tour of the Dart Libraries,当你想知道更多语言特征,挺查阅Dart language specification 你可以通过DartPad 来尝试
<Dart基础>Dart简介
Dart基础系列: Dart简介(https://www.jianshu.com/p/c749f40828a5) Dart语法(上)(https://www.jianshu.com/p/6b5689342e24) <基础Dart语法(下)(https://www.jianshu.com/p/7c3eba46e679) 一、简
Dart基础&gt;Dart语法(上)
Dart基础系列: Dart简介(https://www.jianshu.com/p/c749f40828a5) Dart语法(上)(https://www.jianshu.com/p/6b5689342e24) <基础Dart语法(下)(https://www.jianshu.com/p/7c3eba46e679) 说明:
Dart基础语法简介
Dart基础系列: Dart简介(https://www.jianshu.com/p/c749f40828a5) Dart语法(上)(https://www.jianshu.com/p/6b5689342e24) <基础Dart语法(下)(https://www.jianshu.com/p/7c3eba46e679) 一、简
flutter -- dart基础之dart简介和安装
Dart介绍: Dart是由谷歌开发的计算机编程语言,它可以被用于web、服务器、移动应用 和物联网等领域的开发。 Dart诞生于2011年,号称要取代JavaScript。但是过去的几年中一直不温不火。直到Flutter的出现现在被人们重新重视。 要学Flutter的话我们必须首先得会Dart。 da
Dart | 浅析dart中库的导入与拆分
前言 最近十分热门的跨平台框架使用了一门比较生僻的编程语言dart。dart语言本身深受早期一些编程语言的影响。特别是Smalltalk,Java和JavaScript。我是从Java语言向dart过度的,一开始感觉很不错,快速就对这门语言有了一个初步的认识,并能够写小段代码了。 但在flutter的不断学习过程中,我遇到了不少因为dart的一些语
Dart教程(一):dart安装
一、安装dart sdk brew tap dartlang/dart brew install dart 二、安装VSCode 去官网下载即可 三、安装dart插件 (https://imghelloworld.osscnbeijing.aliyuncs.com/af7d1de25caf6599a4839b56f4f0d
Dart 入门中文教程
一、开篇 dart 语言具有如下特性 一切变量皆是对象,每个对象都是类的实例。int、double、null、函数等都是对象,所有对象都继承自 Object 类 dart 是强类型语言,但由于具备类型推导功能所以类型声明是可选的 dart 支持顶级函数、静态函数、实例函数,也允许在函数中嵌套函数,即局部函数。类似的,dart 也支持顶级
【Flutter 实战】Dart语言简介
1.4 Dart语言简介在之前我们已经介绍过Dart语言的相关特性,读者可以翻看一下,如果读者已经熟悉Dart语法,可以跳过本节,如果你还不了解Dart,也不用担心,按照笔者经验,如果你有过其他编程语言经验(尤其是Java和JavaScript)的话会非常容易上手Dart。当然,如果你是iOS开发者,也不用担心,Dart中也有一些与Swift比较相似的特
【Flutter实战】Dart线程模型及异常捕获
2.6 Flutter异常捕获在介绍Flutter异常捕获之前必须先了解一下Dart单线程模型,只有了解了Dart的代码执行流程,我们才能知道该在什么地方去捕获异常。 2.6.1 Dart单线程模型在Java和ObjectiveC(以下简称“OC”)中,如果程序发生异常且没有被捕获,那么程序将会终止,但是这在Dart或JavaScript中则不会!
Dart中的抽象类、多态、以及接口
一、Dart中的抽象类 Dart中抽象类: Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。   1、抽象类通过abstract 关键字来定义   2、Dart中的抽象方法不能用abstract声明
Flutter - 深入理解Dart虚拟机启动
基于Flutter 1.5,从源码视角来深入剖析引擎启动中的Dart虚拟机启动流程,相关源码目录见文末附录一、概述 1.1 Dart虚拟机概述Dart虚拟机拥有自己的Isolate,完全由虚拟机自己管理的,Flutter引擎也无法直接访问。Dart的UI相关操作,是由Root Isolate通过Dart的C调用,或者是发送消息通知的方式
Dart虚拟机运行原理
一、Dart虚拟机 1.1 引言Dart VM是一种虚拟机,为高级编程语言Dart提供执行环境,但这并意味着Dart在D虚拟机上执行时,总是采用解释执行或者JIT编译。 例如还可以使用Dart虚拟机的AOT管道将Dart代码编译为机器代码,然后运行在Dart虚拟机的精简版环境,称之为预编译运行时(precompiled runtime)环境,该环境不包含任何