参考
https://dart.cn/guides/language/language-tour
下载
从 Flutter 1.21 版本开始,Flutter SDK 会同时包含完整的 Dart SDK 因此如果你已经安装了 Flutter,可能就无需再特别下载 Dart SDK 了。
可以通过命令行dart --version查看版本,目前dart是 2.10.3。
Dart语言特性
- 所有变量引用的都是 对象,每个对象都是一个 类 的实例。数字、函数以及 nul都是对象。所有的类都继承于 Object 类。
- 尽管 Dart 是强类型语言,但是在声明变量时指定类型是可选的,可以使用var来声明,因为 Dart 可以进行类型推断。
- 如果想显式地声明一个不确定的类型,可以使用特殊类型 dynamic/Object。
- Dart 支持泛型,比如 List<int>(表示一组由 int 对象组成的列表)或 List<dynamic>(表示一组由任何类型对象组成的列表)。
- Dart 支持顶级函数(例如 main 方法),同时还支持定义属于类或对象的函数(即 静态 和 实例方法)。你还可以在函数中定义函数(嵌套 或 局部函数)。
- Dart 支持顶级 变量,以及定义属于类 或 对象的变量(静态和实例变量)。实例变量有时称之为 字段 或 属性(fields or properties)。
- Dart 没有类似于 Java 那样的 public、protected 和 private 成员访问限定符。如果一个标识符以下划线 (_) 开头则表示该标识符在库内是私有的。
- 创建对象时,new关键字是可选的。
- assert() 的调用将会在生产环境的代码中被忽略掉。在开发过程中,assert(condition) 将会在 条件判断 为 false 时抛出一个异常。详情请查阅 Assert。
dart编码规范
https://dart.cn/guides/language/effective-dart
关键字
https://dart.cn/guides/language/language-tour#keywords
注释
Dart 支持单行注释、多行注释和文档注释。
其中dart的文档注释除了可以使用java的文档注释,还可以使用的是///,
在文档注释中用[xxx]可以引用类、方法、字段、顶级变量、函数和参数。
library和package
https://dart.cn/guides/language/language-tour#libraries-and-visibility
一个dart文件就是一个library。
package就是一个项目,一个依赖库。
library关键字
library指令可以创建一个库,每个Dart文件都是一个库,即使没有使用library指令来指定。
在生成的文档中要包含任何 Library-Leve的文档,必须要指定 library 命令。
添加依赖
https://dart.cn/tools/pub/dependencies
要导入外部库(比如dart package中央仓储中的):
- 就需要先在项目的pubspec.yam的dependencies中加入那个package,
- 然后点击pub get去下载,
- 在项目根目录会生成一个.packages,该文件将应用程序所依赖的每个包名 相应的映射到 系统缓存中的包。
- 最后在dart文件最上边import。
import library
使用 import 来访问外部library/dart文件。
import 的唯一参数是用于指定代码库的 URI,一个具体的dart文件位置。
- 对于 Dart 内置的库,使用 dart:xxxxxx 的形式。
- 对于本地的dart文件,
- 可以使用绝对路径或相对路径:
- 也可以使用package:xxxxxx,
import 'package:flutter_app/test.dart';
- 对于网络上的库,
可以使用package:xxxxxx,
使用 package: 前缀,导入包中的库,Dart 运行时会抓取 package: 之后的内容,并在应用程序的 .packages 文件中查找它。
而在.packages中,还包含本项目的代码路径,如:
flutter_app:lib/
所以package: xxx的形式也可以用来导入本地library。
指定库前缀
如果你导入的两个代码库有冲突的标识符,你可以为其中一个指定前缀。
比如如果 library1 和 library2 都有 Element 类,那么可以这么处理:
import 'package:lib1/lib1.dart'; import 'package:lib2/lib2.dart' as lib2; // 使用 lib1 的 Element 类。 Element element1 = Element(); // 使用 lib2 的 Element 类。 lib2.Element element2 = lib2.Element();
导入库的一部分
如果你只想使用代码库中的一部分,你可以有选择地导入代码库。例如:
// 只导入 lib1 中的 foo。(Import only foo). import 'package:lib1/lib1.dart' show foo; // 导入 lib2 中除了 foo 外的所有。 import 'package:lib2/lib2.dart' hide foo;
延迟加载库
延迟加载(也常称为 懒加载)允许应用在需要时再去加载代码库,下面是可能使用到延迟加载的场景:
- 为了减少应用的初始化时间。
- 处理 A/B 测试,比如测试各种算法的不同实现。
- 加载很少会使用到的功能,比如可选的屏幕和对话框。
目前只有 dart2js 支持延迟加载, Flutter、Dart VM以及 DartDevc 目前都不支持延迟加载。
分割library
不建议使用。
使用part,part of可以把一个 Library 分割成多个 Dart 文件。
- part指令 是在主文件中引用那个part文件,
- part of指令 是在part文件中指明属于那个主文件的part。
也就是说part,part of需要相互对应才行。
- part文件只能有part of指令,不能有其他的指令(如import)
- 主文件的part指令需要在import下边。
- part文件和主文件可以互相访问对方的成员,包括有下划线”_”前缀的成员。
- part文件和主文件中的成员是不能冲突的。
test.dart
import 'dart:isolate'; part 'test2.dart'; int age = 18; String _name = "123"; void main() { print(haha); }
test2.dart
part of 'test.dart'; String haha = "haha"; void test() { print(_name); }
实现library package
https://dart.cn/guides/libraries/create-library-packages
https://dart.cn/tools/pub/package-layout
最简单的一个library package目录结构:
- pubspec file
Library 的 pubspec.yam文件 与 应用程序的 pubspec.yam文件相同— pubspec.yam文件中并没有特别的指出这个 Package 是一个 Library 。
查看Pubspec 文件详解。
- lib directory
如你所料, Library 的代码位于 lib 目录下,且对于其他 Package 是公开的。你可以根据需要在 lib 下任意创建组织文件结构。
按照惯例,实现代码会放在 lib/src 目录下。 lib/src 目录下的代码被认为是私有的。通过在lib下的的dart中用export指定 lib/src 目录的文件,实现对 lib/src 目录中 API 的公开。
比如english_words的依赖目录结构如下,
english_words.dart是在src外的,其他的都在src中,在english_words.dart中用export来表示下边的dart是公开的:
library english_words; export 'src/syllables.dart'; export 'src/word_pair.dart'; export 'src/words/adjectives.dart'; export 'src/words/all.dart'; export 'src/words/nouns.dart';
常用第三方 package 介绍
https://dart.cn/guides/libraries/useful-libraries
Dart内置库
https://dart.cn/guides/libraries
全平台库列表
下面提供的一些库可以应用于所有 Dart 可运行的平台。
库名称 |
备忘 |
dart:async |
|
dart:collection |
|
dart:convert |
|
dart:core |
默认导入的,不用手动导入。 |
dart:developer |
只支持 JIT 和 dartdevc |
dart:math |
|
dart:typed_data |
原生平台库
下面列出的核心库适用于 Dart 原生平台(AOT 和 JIT 编译运行)。
库名称 |
备忘 |
dart:io |
|
dart:isolate |
|
dart:mirrors |
实验性 |
访问性
在dart中是没有类似java的访问修饰符private,public等,
默认情况下类,顶层函数、变量,类中成员都时public的,
在dart中,名字用_作为前缀的 方法、变量、类只能在本文件中访问,如果有part,那么那个part也能访问。
如果要使用文件外的dart文件定义的东西,需要import导入那个dart文件。