Dart编程语言快速入门
Dart是Google推出的一门编程语言,吸收了现代编程语言的高级特性,目前Dart的版本是Dart2,官网是:www.dartlang.org/
Developers at Google and elsewhere use Dart to create high-quality, mission-critical apps for iOS, Android, and the web. With features aimed at client-side development, Dart is a great fit for both mobile and web apps.
Dart致力于客户端开发,非常适合移动和Web应用程序。
Dart语言的特性
- Productive(生产力高,Dart的语法清晰明了,工具简单但功能强大)
- Fast(执行速度快,Dart提供提前优化编译,以在移动设备和Web上获得可预测的高性能和快速启动。)
- Portable(易于移植,Dart可编译成ARM和X86代码,这样Dart移动应用程序可以在iOS、Android和其他地方运行)
- Approachable(容易上手,充分吸收了高级语言特性,如果你已经知道C++,C语言,或者Java,你可以在短短几天内用Dart来开发)
- Reactive(响应式编程)
Dart的一些重要概念
- 在Dart中,一切都是对象,所有的对象都是继承自
Object
- Dart是强类型语言,但可以用
var
或dynamic
来声明一个变量,Dart会自动推断其数据类型,dynamic
类似c# - 没有赋初值的变量都会有默认值
null
- Dart支持顶层方法,如
main
方法,可以在方法内部创建方法 - Dart支持顶层变量,也支持类变量或对象变量
- Dart没有
public
protected
private
等关键字,如果某个变量以下划线(_
)开头,代表这个变量在库中是私有的
Dart一些语法特点
如果熟悉java或者c#,只需要注意下面的一些语法特性即可,其他的都比较类似,不用特意关注。
命名参数
sayHello({String name}) {
print("hello, my name is $name");
}
sayHello2({name: String}) {
print("hello, my name is $name");
}
main() {
// 打印 hello, my name is zhangsan
sayHello(name: 'zhangsan');
// 打印 hello, my name is wangwu
sayHello2(name: 'wangwu');
}
参数默认值
// 位置参数的默认值
int sum(int a, int b, [int c = 3]) {
return a + b + c;
}
匿名函数
test(Function callback) {
callback("hello");
}
main() {
test((param) {
// 打印hello
print(param);
});
}
is
和c#一样, is运算符用于判断一个变量是不是某个类型的数据
// is!则是判断变量不是某个类型的数据
var s = "hello";
print(s is String); // true
var num = 6;
print(num is! String); // true
??= 和 ?.运算符
??=运算符 如果 ??= 运算符前面的变量为null,则赋值,否则不赋值
var param1 = "hello", param2 = null;
param1 ??= "world";
param2 ??= "world";
print("param1 = $param1"); // param1 = hello
print("param2 = $param2"); // param2 = world
?.运算符
var str1 = "hello world";
var str2 = null;
print(str1?.length); // 11
print(str2?.length); // null
print(str2.length); // 报错
..运算符(级联操作)
使用..调用某个对象的方法(或者成员变量)时,返回值是这个对象本身,这样就能方面实现链式调用:
class Person {
eat() {
print("I am eating...");
}
sleep() {
print("I am sleeping...");
}
study() {
print("I am studying...");
}
}
main() {
// 依次打印
// I am eating...
// I am sleeping...
// I am studying...
new Person()..eat()
..sleep()
..study();
}
不一样的try/catch
// try catch语句
try {
print(1 ~/ 0);
} catch (e) {
// IntegerDivisionByZeroException
print(e);
}
try {
1 ~/ 0;
} on IntegerDivisionByZeroException { // 捕获指定类型的异常
print("error"); // 打印出error
} finally {
print("over"); // 打印出over
}
类(Class)
- 不需要用private, protected, public等修饰成员变量或成员函数
- 构造函数可以不用方法体,自动对应
class Person {
String name;
int age;
String gender;
Person(this.name, this.age, this.gender);
sayHello() {
print("hello, this is $name, I am $age years old, I am a $gender");
}
}
getter/setter方法
class Rectangle {
num left, top, width, height;
// 构造方法传入left, top, width, height几个参数
Rectangle(this.left, this.top, this.width, this.height);
// right, bottom两个成员变量提供getter/setter方法
num get right => left + width;
set right(num value) => left = value - width;
num get bottom => top + height;
set bottom(num value) => top = value - height;
}
mixins
mixins是一个前端很火的概念,是一个重复使用类中代码的方式。
class A {
a() {
print("A's a()");
}
}
class B {
b() {
print("B's b()");
}
}
// 使用with关键字,表示类C是由类A和类B混合而构成
class C = A with B;
main() {
C c = new C();
c.a(); // A's a()
c.b(); // B's b()
}
异步
Dart
提供了类似ES7中的async
await
等异步操作,这种异步操作在Flutter开发中会经常遇到,比如网络或其他IO操作,文件选择等都需要用到异步的知识。 async
和await
往往是成对出现的,如果一个方法中有耗时的操作,你需要将这个方法设置成async
,并给其中的耗时操作加上await
关键字,如果这个方法有返回值,你需要将返回值塞到Future
中并返回,如下代码所示:
Future checkVersion() async {
var version = await lookUpVersion();
// Do something with version
}
下面的代码使用Dart
从网络获取数据并打印出来:
import 'dart:async';
import 'package:http/http.dart' as http;
Future getNetData() async{
http.Response res = await http.get("http://www.baidu.com");
return res.body;
}
main() {
getNetData().then((str) {
print(str);
});
}
关于Dart
异步操作,可以查看这篇文章了解更多。
本文参考