首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com技术社区-IT企服评测·应用市场
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
Flutter/Dart第07天:Dart基础语法详解(库、导入和关键 ...
返回列表
发新帖
Flutter/Dart第07天:Dart基础语法详解(库、导入和关键字)
[复制链接]
发表于 2023-10-12 02:13:03
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
Dart官网
文档
:
https://dart.dev/language/libraries
重要说明:
本博客基于Dart官网
文档
,但并不是简单的对官网进行翻译,在覆盖核心
功能
情况下,我会根据个人研发经验,加入自己的一些扩展问题和场景验证。
Dart中的库(Library)
Dart语言对
代码
的复用下了不少功夫,如前面讲到的Mixin高级特性实现类级别
代码
复用。本文介绍另一种更宽广的
代码
复用:
库
。
Dart库可以认为是一组复用类、
功能
等的集合,它则代表了一个共享的代码模块,任何一个.dart文件都是一个库。
Dart库有一个隐含的规则:凡是以下划线_开头的标识符仅在本库内部可见,其他在库内外部均可见。(Dart没有private/protected/public可见域标识符,那么对应Java语言,下划线_开头为private,其他的为public,Dart没有protected)。
Dart库可以基本可分为3种,建议在使用时严格按照这3类导入库:
Dart中的内置库,即SDK中的库(对于Java语言如java.util.Map),以dart:作为命名空间。
Dart包中心仓库的库(对于Java语言为Maven中心仓库),以package:作为命名空间。
本地文件代码库,以相对路径或者绝对路径作为命名空间。当然,本地代码块也可以使用package作为命名空间,容易和第2中混淆,因此不推荐。
如何使用库(import关键字)
通过import关键字指定在一个库中使用另外一个命名空间的库。
代码样例:
如下代码,我们导入了Dart内置的html库、中心仓库get库,和本地库。
// 内置库
import 'dart:html';
// 中心仓库
import 'package:get/get.dart';
// 本地代码库
import '../01-ntopic-hellodart.dart';
复制代码
指定库前缀(as关键字)
研发过程中,我们有时会导入有相同标识符,那么在使用过程中就会产生冲突,这时可以通过as关键字进行重命名库,同时在使用的时候,增加前缀进行区分。
代码样例:
如下代码,我们导入了
lib1
和
lib2
两个库,它们都有
Element
这个类。
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
// `lib1`库中Element类
Element element1 = Element();
// `lib2`库中Element类,通过`lib2`前缀解决冲突
lib2.Element element2 = lib2.Element();
复制代码
导入部分库(show/hide关键字)
我们有时候只需要用到某个库的一部分代码或者类,或者需要排除某个库中指定的代码,通过增加show和hide关键字可实现。
代码样例:
如下代码,我们用到了
lib1
和
lib2
两个库,
lib1
通过show仅导入了
foo
这个标识符(类名、常量名等),而
lib2
通过hide导入除
foo
之外的其他所有标识符。
// 仅导入`foo`
import 'package:lib1/lib1.dart' show foo;
// 导入除`foo`之外所有
import 'package:lib2/lib2.dart' hide foo;
复制代码
延迟导入库(deferred as关键字)
Web应用中通过延迟导入库,可以实现按需加载,如下几种常见的应用场景:
减少Web应用的启动时间。
A/B测试,比如切流不同的算法库。
不常用的
功能
,比如可选页面、弹窗等。
代码样例:
如下代码,通过deferred as关键字,实现延迟导入库,在实际使用库功能时需要导入库(如:await hello.loadLibrary();),在库加载完成之前,会阻塞代码执行。执行loadLibrary()方法仅实际加载库一次,后续调用该方法不会重复加载。
// 1. 延迟导入库
import 'package:greetings/hello.dart' deferred as hello;
// 2. 实际使用时,使用库前缀
Future<void> greet() async {
// 加载库,加载成功之前阻塞后续代码执行,多次调用仅加载一次
await hello.loadLibrary();
hello.printGreeting();
}
复制代码
特别注意:
延迟导入库中的常量,在该库导入之前并不存在,因此它们并不是
导入库
(即使用它们的文件)中的常量。
延迟导入库在导入之前并不存在,因此
导入库
不能使用它们的类型(包括类、枚举等),可以考虑把公共代码(如基础类、接口等)抽取出来作为单独的库,让延迟导入库和导入库共同导入使用。
当使用deferred as XXX延迟导入库时,Dart隐含的给loadLibrary()增加了XXX命名空间。如上代码,loadLibrary()方法是异步的,返回一个Future。
Dart中的关键字(共67个)
Dart官方
文档
:
https://dart.dev/language/keywords
Dart关键字一共包含67个,本博客不重复列出这67个关键字,仅对关键字进行说明:
尽量避免
使用这些关键字作为标识符,如有必要,表格中有1,2,3上标的关键字在部分常见可以使用作为标识符。
上标为1的关键字与
上下文
有关,离开了上下文,这些关键字可以作为标识符。如show和hide关键在只在导入库上下文文中用到,其他地方可以正常作为标识符。
上标为2的关键字是Dart
内置
的标识符,它们在大部分场景可以使用,但是禁止在类名、类型名和指定库的前缀(其实也是类型的一种)。
上标为3的关键字(共2个:await/yield)限制在异步编程场景使用,在标记为async/async*/sync*同步和异步函数内部,禁止使用。
我的本博客原地址:
https://ntopic.cn/p/2023100201
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
继续阅读请点击广告
回复
使用道具
举报
返回列表
慢吞云雾缓吐愁
+ 我要发帖
×
登录参与点评抽奖,加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表