1.简单的Dart程序
void printInteger(int aNumber) {
print('The number is $aNumber');
}
void main() {
var number = 42;
printInteger(number);
}
1.上面代码解释
- // 注释
- 以双斜杠开头的一行语句称为单行注释,Dart同样支持多行注释和文档注释
- void
- 一种特殊的类型,表示一个值永远不会被使用。类似于main()和printInteger()的函数,以及void声明的函数返回类型,并不会返回值
- int
- 42
- print()
- '…'或"…"
- $variableName(或${expression})
- main()
- 一个特殊且必须的顶级函数,Dart应用程序总是会从该函数开始执行
- var
- 用于定义变量,通过这种方式定义变量不需要指定变量类型
2.Dart重要概念
- 所有变量引用的都是对象,每个对象都是一个类的实例;数字、函数以及null都是对象。除去null以外(如果开启了空安全),所有的类都继承于Object类
- Dart是强类型语言,但是在声明变量时指定类型是可选的,因为Dart可以进行类型推断
- 如果开启了空安全,变量在未声明为可空类型时不能为null。通过在类型后加上问号(?)将类型声明为可空;表达式后添加 ! 断言表达式不为空(为空时抛出异常)
- 显示地声明任意类型,使用Object?(如果开启了空安全)、Object或者特殊类型dynamic将检查延迟到运行时进行
- Dart支持泛型,比如List<int>或List<Object>
- Dart支持顶级函数,同时还支持定义属于类或对象的函数(即静态和实列方法)。还可以在函数中定义函数(嵌套或局部函数)
- Dart支持顶级变量,以及定义属于类或对象的变量(静态和实列变量);实列变量有时称为域或属性
- Dart没有类似于JAVA那样的public、protected和private成员访问限定符。如果一个标识以下划线(_)开头则表示该标识符在库内是私有的
- 标识符可以以字母或下划线(_)开头,其后可跟字符和数字的组合
- Dart中表达式和语句区别,表达式有值而语句没有
- Dart工具可以显示警告和错误两种类型的问题。警告表明代码可能有问题但不会阻止其运行。错误分为编译时错误和运行时错误;编译时错误代码无法运行,运行时错误会在代码运行时导致异常
3.变量
3.1默认值
- 在Dart中,未初始化以及可空类型的变量拥有一个默认的初始值null,即便数字也是如此,因为Dart中一切皆为对象,数字也不例外
int? lineCount;
assert(lineCount == null);
- assert()的调用将会在生产环境的代码中被忽视,在开发过程中,assert(condition)将会在条件判断未false时抛出一个异常
- 若开启了空安全,必须在使用变量前初始化它的值’
int lineCount = 0;
3.2延迟初始化变量
- Dart 2.12新增了 late 修饰符,这个修饰符可以在一下情况中使用
- 声明一个非空变量,但是不在声明时初始化
- 延迟初始化一个变量
late String description;
void main(){
description = 'Feijoada';
print(description);
}
- 若 late 标记的变量在使用前没有初始化,在变量被使用时会抛出运行时异常
3.3Final和Const
- 不想更改一个变量,可以使用关键字final或者const修饰变量,这两个关键字可以替代var关键字或者加在一个具体的类型前。一个final变量只可以被赋值一次,一个const变量是一个编译时常量(const变量同时也是final的)
- 实列变量可以是final的但不可以是const
final name = 'Bob';
final String nickname = 'Bobby';
- 使用关键词const修饰变量表示该变量未编译时变量。如果使用const修饰类中的变量,则必须加上static关键字,即 static const。在声明const变量是可以直接为其赋值,也可以使用其他的const变量为其赋值
const bar = 1000;
const double atm = 1.0315* bar;
- const 关键字不仅仅可以用来定义常量,还可以用来创建 常量值,该常量值可以赋予给任何变量。你也可以将构造函数声明为 const 的,这种类型的构造函数创建的对象是不可改变的
var foo = const [];
final bar = const [];
const baz = [];
foo = [1, 2, 3];
- 可以在常量中使用 类型检查和强制类型转换 (is 和 as)、 集合中的 if 以及 展开操作符 (… 和 …?)
const Object i = 3;
const list = [i as int]
const map = {if(i is int)i: 'int'}
const set = {if (list is List<int>)...list
4.内置类型
4.1 Number(int,double)
1.int
- 整数值,长度不超过64位,具体取值范围依赖于不同的平台,在DartVM上的取值范围-2^63 ~ 2^63-1;在web上,整型数值代表JS的数字(64位无小数浮点型),其允许取值范围 -2^53 ~ 2^53-1
var x = 1;
var hex = 0xDFEABBA;
2.double
- 64位的双精度浮点数字,且符合IEEE 754标准
var y = 1.1
var exponents = 1.42e5;
3.其他
- int和double都是number的子类,如果number及其子类不能满足你的要求,可以查看dart:math库中的API
double num = 1;
var one = int.parse('1');
String piAsString = 3.1415926.toStringAsFixed(2);
4.2 Strings(String)
- Dart字符串(String对象)包含了UTF-16编码的字符序列,可以使用单引号或双引号来创建字符串
var s1 = "双引号创建字符串";
var s2 = '单引号创建字符串';
1. ${表达式}
- 在字符串中,请以${表达式}的形式使用表达式,如果表达式是一个标识符,可以省略{};如果表达式的结果为一个对象,则Dart会调用该对象的toString()方法来获取一个字符串
var s = '字符串插值';
assert('Dart 有$s,使用起来非常方便。' == 'Dart 有字符串插值,使用起来非常方便。');
assert('使用${s.substring(3,5)}表达式也非常方便' == '使用插值表达式也非常方便。');
4.3 Booleans(bool)
4.4 Lists(也称为arrays)
4.5 Sets(Set)
4.6Maps(Map)
4.7 Runes(常用于在Characters API 中进行字符替换)
4.8 Symbols(Symbol)
4.9 The value null(Null)