Flutter/Dart第07天:Dart根底语法详解(库、导入和关键字)
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