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

本文讲述了Dart编程中库的导入规则,包括库导出的命名空间、避免名称冲突的方法(show、hide)、不完全导入以及库的拆分(part)。同时提到了JsonSerializable的使用和大厂面试真题的相关分享。
摘要由CSDN通过智能技术生成

一个库可以使用的全部对象包括这个库本身声明的,以及通过导入语句从其他库导入的。在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 的一部分。

import ‘package:json_annotation/json_annotation.dart’;
part ‘data.g.dart’;

@JsonSerializable()
class Data{
final String by;
final int descendants;
final int id;
final List kids;
final int score;
final int time;
final String title;
final String type;
final String url;

Data({this.by, this.descendants, this.id, this.kids, this.score, this.time,
this.title, this.type, this.url});
//反序列化

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

七大模块学习资料:如NDK模块开发、Android框架体系架构…

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
**第三,**到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。

由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
不知道该如何发展,转型管理,还是加强技术研究。

由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值