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

待兔
• 阅读 1532

前言

最近十分热门的跨平台框架使用了一门比较生僻的编程语言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中库的导入与拆分的全部内容,若有描述不准确或错误之处欢迎各位大牛指正。

点赞
收藏
评论区
推荐文章
顺心 顺心
3年前
Dart语言基础,Dart 基础
1.Dart的main方法有两种声明方式//第一种声明方式main(){print("helloworld");//打印};//第二种声明方式.如果有学过typeScript或其它语言的同学都明白下面代码的意思,这个方法是有没返回值的。voidmain(){print("helloworld");};2.
简
3年前
Dart虚拟机运行原理
一、Dart虚拟机1.1引言DartVM是一种虚拟机,为高级编程语言Dart提供执行环境,但这并意味着Dart在D虚拟机上执行时,总是采用解释执行或者JIT编译。例如还可以使用Dart虚拟机的AOT管道将Dart代码编译为机器代码,然后运行在Dart虚拟机的精简版环境,称之为预编译运行时(precompiledruntime)环境,该环境不包含任何
待兔 待兔
3年前
flutter -- dart基础之dart简介和安装
Dart介绍:Dart是由谷歌开发的计算机编程语言,它可以被用于web、服务器、移动应用和物联网等领域的开发。Dart诞生于2011年,号称要取代JavaScript。但是过去的几年中一直不温不火。直到Flutter的出现现在被人们重新重视。要学Flutter的话我们必须首先得会Dart。da
顺心 顺心
3年前
Dart 入门中文教程
一、开篇dart语言具有如下特性一切变量皆是对象,每个对象都是类的实例。int、double、null、函数等都是对象,所有对象都继承自Object类dart是强类型语言,但由于具备类型推导功能所以类型声明是可选的dart支持顶级函数、静态函数、实例函数,也允许在函数中嵌套函数,即局部函数。类似的,dart也支持顶级
待兔 待兔
4年前
[Dart]Dart语言之旅<一>:简介
我们假定你已经知道如何用另一种语言编程,《Dart语言之旅》将向你展示了如何使用每个主要的Dart特性——从变量和运算符到类和库。一个基本的Dart程序下面的代码使用了许多Dart最基本的功能://Defineafunction.printNumber(numaNumber){print('Thenumberis$a
Johnny21 Johnny21
3年前
Google Dart抗衡JavaScript的十大亮点
【IT168技术】导读:Google是家充满创新力的公司。他们不喜欢Javascript了,于是自己推出了Dart。不负众望,Dart在今年的编程语言排行榜中成了一匹黑马,一经发布便窜到了排行榜107位,次月居然到了63,速度惊人。根据原文编译的
待兔 待兔
4年前
Dart官方文档翻译(一)(Dart之旅)
这篇文章将会向你展示如何使用Dart的每一个知识点,包括变量,操作符,类,类库,但这是在你已经有一个其他语言的编码经验的前提下。为了学习Dart更多关于Dart的核心类库,请查看ATouroftheDartLibraries,当你想知道更多语言特征,挺查阅Dartlanguagespecification你可以通过DartPad来尝试
浩浩 浩浩
3年前
【Flutter 实战】Dart语言简介
1.4Dart语言简介在之前我们已经介绍过Dart语言的相关特性,读者可以翻看一下,如果读者已经熟悉Dart语法,可以跳过本节,如果你还不了解Dart,也不用担心,按照笔者经验,如果你有过其他编程语言经验(尤其是Java和JavaScript)的话会非常容易上手Dart。当然,如果你是iOS开发者,也不用担心,Dart中也有一些与Swift比较相似的特
Stella981 Stella981
3年前
Flutter 不一样的跨平台解决方案
本文主要介绍Flutter相关的东西,包括Fuchsia、Dart、Flutter特性、安装以及整体架构等内容。1\.简介Flutter作为谷歌最近推出的跨平台开发框架,一经推出便吸引了不少注意。关于Flutter,目前我们知道它是一个跨平台开发框架。但是它本身并不止于此,例如Fuchsia、Dart等,我们也都需要去了解。
Stella981 Stella981
3年前
Flutter 介绍、运行环境
Flutter是谷歌公司开发的一款开源、免费的移动UI框架,可以让我们快速的在Android和iOS上构建高质量App。它最大的特点就是跨平台、以及高性能。Flutter基于谷歌的dart语言,如果没有任何Dart语言的基础,不建议直接学习Flutter。建议先学习Dart语言的基本语法。然后再进入Flutter的学习