Dart编程语言入门

Flutter是使用Dart语言进行开发的,所以我们需要先学习下Dart语言。

配置IDEA

我们使用IDEA学习Dart语言,先配置IDEA,让IDEA支持Dart开发。

起步:配置编辑器

在 InteIIiJ IDEA 中搭建 Dart 的开发环境

如果按照前面的步骤搭建的Flutter的开发环境,那么Dart的Sdk的路径为:

1
/Users/macbook/flutter/bin/cache/artifacts/engine/darwin-x64/dart-sdk

Dart Hello World

打开IDE 新建Dart程序

新建Dart文件

1
2
3
4
void main(){
var str="Hello Dart"
print(str);
}

控制台输出:

1
2
Hello Dart
Process finished with exit code 0

Dart语言概述

在 InteIIiJ IDEA 中搭建 Dart 的开发环境

Dart语法糖

变量

1
2
3
4
5
6
7
8
9
10
11
12
var name ="flyou";
String name1="flyou";

var age =25;
int age1 =25;

void main(){
println(name);
println(name1);
println(age);
println(age1);
}

控制台输出:

1
2
3
4
flyou
flyou
25
25

在Dart中可以使用关键字var声明一个变量,Dart编译器会根据变量的值自动推断出变量的类型和使用已知类型声明变量的是一样的。main()方法是Dart的入口方法,和JAVA中的main方法很类似。

常量

使用final和const关键字都可以声明一个常量,但是与final不同的是const是编译期常量,也就是说在编译器编译时使用const声明的常量必须是已经确定的值。使用final和const修饰的变量不可以从新赋值。

内置类型

  • numbers
  • strings
  • booleans
  • lists (和数组是一个概念)
  • maps 字典
  • runes ( Unicode 字符串)
  • symbols 符号

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void main(){
var str1 = "str1";
var num1 = 1;
var double1 = 10.2;
var flag1 = false;
var list1 = [1, 3, 5, 7, 9];
var map1 = {"name": "flyou", "age": 12};

print(str1);
print(num1);
print(double1);
print(flag1);
print(list1);
print(map1);
}

控制台输出:

1
2
3
4
5
6
str1
1
10.2
false
[1, 3, 5, 7, 9]
{name: flyou, age: 12}

方法(函数)

Dart是完全面向对象的语言,函数在Dart中也是一种对象,也就是说函数也可以像其他参数一样在函数间传递。

1
2
3
4
5
6
7
bool isEvenNumber(int num) {
return num % 2 == 0;
}

void main() {
print(isEvenNumber(11));
}

控制台输出:

1
false

上面是函数定义的最基本的方法,和其他语言定义函数的方法基本一致。

对于只包含一个表达式的函数可以简写为以下的方式

1
bool isEvenNumber(int num) => num % 2 == 0;

可以使用=>替换原来的 return和{} 类似 => expr{ return expr; }

可选参数

1
2
3
void printStr1([String name,int age]){
print("Name is $name age is $age");
}

在调用这个函数的时候我们可以选择只输入name或者只输入age,当然上面的函数如果我们只输入一个函数值另一个函数的值就会被赋为null

1
printStr1("flyou");

输出:

1
Name is flyou age is null

如果我输入一个int类型的值,Dart会将它自动赋值给第一个符合该类型的入参上

1
printStr1(25);

输出:

1
Name is null age is 25

如果函数有多个相同类型的函数参数,这个时候只输入一个值,它默认会赋值给第一个参数如:

1
2
3
void printStr2([String name,String sex,String address]){
print("Name is $name age is $sex address is $address");
}
1
printStr2("男");

输出:

1
Name is 男 sex is null address is null

当然这并不是我们想要的,所以就需要看下可选择名称的函数。

可选择名称的函数(具名函数)

1
2
3
void printStr3({String name,int age}){
print3("Name is $name age is $age");
}

使用{}包括函数参数就可以把原来的函数变成可选择名称函数,在调用时可以直接指定参数名传值。
当然,我们也可以选择只传入一个参数,另一个参数在使用的地方做判断或者使用函数的默认值(下面会说)

1
printStr4(name: "flyou");

输出:

1
Name is flyou age is null

同样如果有多和相同类型的入参,我们可以根据声明参数名调用的方式来调用函数如:

1
2
3
void printStr3({String name,String sex,String address}){
print("Name is $name sex is $sex address is $address");
}
1
printStr3(sex: "男");

输出:

1
Name is null sex is 男 address is null

当然,就算我们少输入了一个参数但是每次都给我输出个null也非常的不友好啊,当然在Dart中你可以使用参数默认值来解决这个问题。

函数参数的默认值

函数的默认值,顾名思义就是你就算不输入这个参数我也会默认给你一个值的,当然前提是这个参数你可以省略的前提下(上面两类函数啊)

可选参数

1
2
3
void printStr1([String name,int age=25]){
print("Name is $name age is $age");
}
1
printStr2("男");

输出:

1
Name is 男 sex is null address is 25

Dart中的命名参数和可选参数有什么区别?

具名函数

1
2
3
void printStr3({String name,int age=25}){
print3("Name is $name age is $age");
}
1
printStr3("男");

输出:

1
Name is 男 sex is null address is 25

对象传递

函数可以把自己作为一个对象传递给另外一个函数

1
2
3
4
5
void printStr4(String str) {
print(str);
}
var listStr=["hello ","world","haha","!"];
listStr.forEach(printStr4);

输出:

1
2
3
4
hello 
world
haha
!

操作符

描述 操作者
一元后缀 expr++ expr– () [] . ?.
一元前缀 -expr !expr ~expr ++expr –expr
乘除 * / % ~/
加减 + -
位操作 << >>
按位与 &
按位XOR ^
按位或 |
关系和判断 >= > <= < as is is!
相等与不相等 == !=
逻辑与 &&
逻辑OR ||
如果为null ??
三目运算 expr1 ? expr2 : expr3
级联 ..

具体用法不在具体介绍,和其他语言类似,当然大家参照官网做一下练习 。

控制流

if else

条件语句

1
2
3
4
5
6
7
if (isRaining()) {
you.bringRainCoat();
} else if (isSnowing()) {
you.wearJacket();
} else {
car.putTopDown();
}

for

循环语句

1
2
3
4
var message = new StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
message.write('!');
}

while 、do while

循环语句

1
2
3
4
5
6
7
while (!isDone()) {
doSomething();
}
do {
printLine();
}
while (!atEndOfPage());

Break and continue

跳出循环

1
2
3
4
5
while (true) {
if (shutDownRequested())
break;
processIncomingRequests();
}

Switch and case

分支语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var command = 'OPEN';
switch (command) {
case 'CLOSED':
executeClosed();
break;
case 'PENDING':
executePending();
break;
case 'APPROVED':
executeApproved();
break;
case 'DENIED':
executeDenied();
break;
case 'OPEN':
executeOpen();
break;
default:
executeUnknown();
}

异常处理

使用thorw可以向上层抛出一个异常
例如:

1
2
3
void throwException(){
throw new FormatException("异常了");
}

这样就可以将一个异常跑向上层调用处,如果上层不处理这个异常则会引发崩溃

1
2
3
void main() {
throwException();
}

异常信息

1
2
3
4
5
6
Unhandled exception:
FormatException: 异常了
#0 throwException (file:///D:/Learn1/learn/Learn4.dart:15:3)
#1 main (file:///D:/Learn1/learn/Learn4.dart:8:3)
#2 _startIsolate.<anonymous closure> (dart:isolate-patch/dart:isolate/isolate_patch.dart:277)
#3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/dart:isolate/isolate_patch.dart:163)

try catch
和其他语言类似Dart可以使用try catch未处理的异常

1
2
3
4
5
6
7
void main() {
try {
throwException();
} catch (e) {
print(e);
}
}

控制台输出:

1
FormatException: 异常了

finally
无论是否异常,都会执行的语句块

小结

当然,Dart语言的语法不仅仅只有这些,今天主要是简单介绍了Dart最基本的使用方式,更多Dart语法详见Dart官方网站

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器