Dart _ 浅析 dart 中库的导入与拆分
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。
这里我们可以看到,parttest2.dart 是 part of 'parttest.dart'的文件,可以理解为,parttest2 是 parttest 的一部分。在 part test2.dart 中,我们并没有引入 package:flutter/material.dart 包就直接继承了 StatelessWidget,是因为,在 part 中,import 进来的库是共享命名空间的。
不是所有的库都有名称,但如果使用 part 来构建库,那么库必须要命名。
library xxx;
每个子 part 都存放在各自的文件中。但是它们共享同一作用域,库的内部命名空间,以及所有的导入(import)。
下面这个例子是在 Json 反序列化时使用
到库的拆分。
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'data.dart';
// **************************************************************************// JsonSerializableGenerator// **************************************************************************
Data _$DataFromJson(Map<String, dynamic> json) {return Data(by: json['by'] as String,descendants: json['descendants'] as int,id: json['id'] as int,kids: (json['kids'] as List)?.map((e) => e as int)?.toList(),score: json['score'] as int,time: json['time'] as int,title: json['title'] as String,type: json['type'] as String,url: json['url'] as String);}
Map<String, dynamic> _$DataToJson(Data instance) => <String, dynamic>{'by': instance.by,'descendants': instance.descendants,'id': instance.id,'kids': instance.kids,'score': instance.score,'time': instance.time,'title': instance.title,'type': instance.type,'url': instance.url};
然后作为 data.dart 的一部分。
评论