- part of dart.core;
- @pragma("vm:entry-point")
- class Object {
- const Object();
- external bool operator ==(Object other);
- external int get hashCode;
- external String toString();
- @pragma("vm:entry-point")
- external dynamic noSuchMethod(Invocation invocation);
- external Type get runtimeType;
- }
在我们阅读dart源码时,会看到external关键字。这个关键字类似java中的native关键字。通过这个关键对dart语言的开发有解耦的作用,natvie code用同一套代码,上层可以面向web和手机端。
as 是类型转换,其相当于 :先检测 其是不是,然后再调用的一种简写。但是还不是完全一致,当不是的时候,as 会抛出exception。
当且仅当您确定对象属于该类型时,才使用as
运算符将对象强制转换为特定类型。例子:
(employee as Person).firstName = 'Bob';
is 判断是否是某个类型,返回true或者false。如果a 是b的实现类,那么a is b 就返回true。
if ( employee is Person ) { // 类型检查 员工。名字= '鲍勃' ; }
用于库的选择导入。如果只想使用库的一部分,可以选择性地导入库。例如:
// 只导入了foo. import 'package:lib1/lib1.dart' show foo; // 导入除foo之外的所有包. import 'package:lib2/lib2.dart' hide foo;
Deferred loading(也称懒加载),允许 Web 应用在需要库时按需加载库。以下是您可能使用延迟加载的一些情况:
减少 Web 应用程序的初始启动时间。
执行 A/B 测试——例如,尝试算法的替代实现。
加载很少使用的功能,例如可选屏幕和对话框。
只有 dart2js 支持延迟加载。 Flutter、Dart VM 和 dartdevc 不支持延迟加载。
要延迟加载库,您必须首先使用deferred as
.
import 'package:greetings/hello.dart' deferred as hello;
当您需要该库时,请 loadLibrary()
使用该库的标识符进行调用。
- Future<void> greet() async {
- await hello.loadLibrary();
- hello.printGreeting();
- }
在前面的代码中,await
关键字暂停执行,直到库被加载。有关async和await 更多信息,请参阅异步支持。
loadLibrary()
您可以在库上多次调用而不会出现问题。该库仅加载一次。
使用延迟加载时请记住以下几点:
延迟库的常量不是导入文件中的常量。请记住,在加载延迟库之前,这些常量不存在。
您不能在导入文件中使用延迟库中的类型。相反,请考虑将接口类型移动到由延迟库和导入文件导入的库中。
Dart 隐式插入loadLibrary()
到您使用定义的命名空间中。该函数返回一个deferred as namespace,loadLibrary()函数将返回一个Future
Dart 2.12添加了late,主要有2个作用:
声明一个在声明后初始化不可为空的变量。
懒惰地初始化一个变量。
通常 Dart 的控制流分析可以检测到一个不可为空的变量在使用之前何时设置为非空值,但有时分析会失败。两种常见的情况是顶级变量和实例变量: Dart 经常无法判断是否设置了,所以不尝试。
如果您确定变量在使用之前已设置,但 Dart 不同意,您可以通过将变量标记为来修复错误late
:
- late String description;
-
- void main() {
- description = 'Feijoada!';
- print(description);
- }
如果您未能初始化
late
变量,则在使用该变量时会发生运行时错误。
当您将变量标记为late
但在其声明时对其进行初始化时,初始化程序会在第一次使用该变量时运行。这种惰性初始化在以下几种情况下很方便:
该变量可能不需要,并且初始化它的成本很高。
您正在初始化一个实例变量,它的初始化程序需要访问this
.
在以下示例中,如果temperature
从未使用过变量,则永远不会调用昂贵的readThermometer()
函数:
- // This is the program's only call to readThermometer().
- late String temperature = readThermometer(); // Lazily initialized.