Dart 初探(一)
Google 大法好,Go、Dart,两开花。
前言
Dart 是 Google 为 Flutter 开发的一款用于网页编程的语言,其类似于Javascript,也是一种面向对象的语言,但其采用基于类的编程,语法风格接近C语言。
虽说它是开发用于网页编程的,但它也可以开发命令行应用,甚至可以用于开发移动端应用,如 Flutter 就是一款基于 Dart 语言、用于移动端开发的跨平台开发套件。本篇文章的目的是先简单了解下 Dart 语言基础,为以后的 Flutter 开发做准备。
开始:创建一个 Dart 项目
使用VS Code,安装 Dart 扩展:
创建 Dart 项目:
Ctrl + Shift + P
打开命令面板,输入dart
点击 Dart: New Project
,选择第二项 Console Application
之后选择一个新项目所在路径,VS Code 就会自动创建一个示例项目。
点击 main()
方法上方的 Run
按钮,就可以运行项目代码:
可以看到,Dart 项目输出了结果。
基本语法:变量声明
变量 var
关键字
1 | // var 变量, 可接受任何类型变量, |
根基类 Object
和 变量 dynamic
关键字
Object
是 Dart 所有对象的根基类,也就是说在 Dart 中所有类都是Object
的子类(包括Function
和Null
)dynamic
声明的对象编译器会提供所有可能的组合,因此编译时可能不会报错,但在运行时可能会产生报错——运行时错误Object
声明的对象只能使用Object
的属性与方法,否则编译器会报错1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20// dynamic 变量
// 与var 不同, 赋值后类型可以修改
dynamic tt;
tt = "cool guy";
print(tt);
tt = "cool boy"; //可重新赋值
print(tt);
tt = 10086; //也可赋值为其他类型
print(tt);
//提供可能的内部方法的组合,编译时不会报错,
//但对象的属性或方法不存在时运行时会报错
print(tt.length);
// Object 类
// 所有 对象的根基类, 任何类型均可赋值给Object对象
Object o = "ohhhhh!";
print(o);
o = 5201314; //可重新赋值,可赋值为其他类型值
print(o);
//print(o.length); //只能使用Object对象的方法,否则编译器会报错
变量 final
和 const
关键字
如果打算声明一个不改变的变量值,使用final
或 const
const
变量是一个编译时常量(编译时直接替换为常量值)final
变量在第一次使用时被初始化
1 | // final 变量 |
空安全
- 不可空类型使用前必须初始化,可空类型使用前必须判空
- 预期变量不能为空,但在定义时不能确定其初始值,则可以加上
late
关键字,表示会稍后初始化,但是在正式使用它之前必须得保证初始化过了,否则会报错 - 可空类型的变量,在某些情况下即使我们给它赋值过了,但是预处理器仍然有可能识别不出,这时我们就要显式(通过在变量后面加一个”!“符号)指定其不为
null
- 可空类型的函数变量,使用
?.call()
进行调用,表示不为空时调用函数
1 | // 空安全 |
进阶语法:函数
函数式编程
Dart 作为一种真正的面向对象的语言,即使函数也是对象,且属于一个类型Function
,这说明函数可以赋值给变量或者作为参数传递给其他函数,这正是函数式编程的典型特征。
函数声明
- 不显式声明返回值类型,会默认当作
dymastic
处理,没有类型推断
1 | int sum(int a, int b) { |
函数参数
可选的位置参数:使用
[]
对可空类型参数进行包装, 需放置在参数列表的最后面1
2
3
4
5
6
7
8
9
10// 函数参数
String see(String from, String msg, [String? states]) {
var result = '$from see $msg';
if (states != null) {
result = '$result in $states';
}
return result;
}
print(see('I', 'you')); // 不带可选参数调用
print(see('I', 'you', 'a football game')); // 带可选参数调用可选的命名参数:使用
{}
对可空类型参数进行包装, 需放置在列表参数的最后面。Flutter中常用。1
2
3
4void setFlags({bool? isFromOuter, bool? isShow}) {
// 处理逻辑...
}
setFlags(isFromOuter: false, isShow: true); // 带可选参数调用说明:不能同时使用可选的位置参数和可选的命名参数;可选参数列表需为可空类型,否则编译会报错
函数作为变量
1 | // 函数作为变量 |
函数作为类型参数
1 | // 函数作为函数参数 |