一、语言概述
Dart是一种由Google开发的客户端应用程序编程语言。它能够满足Web、移动和桌面应用程序的开发需要。
Dart 2是Dart语言的最新版本。在Dart 2中,类型注释、强类型检查、异步编程等现代编程语言的特性被加入了Dart语言中。这些改进让Dart不仅易学易用,而且也越来越适合Web开发和其他领域的应用。
Dart支持AOT和JIT两种编译方式。用AOT编译可以将代码转化成机器码并打包到二进制文件中,使用JIT编译可以让代码在运行时即时编译。同时,Dart也支持Tree Shaking的特性,这使得在生产环境下生成的包更小,运行速度更快。
二、基本语法
Dart的语法结构类似于Java或JavaScript。它支持变量、函数、类、接口、枚举和Mixin等语言特性。
1、变量
Dart中的变量有强类型和弱类型两种。在使用弱类型时,需要将变量类型设置为dynamic。下面是定义弱类型变量的示例:
dynamic weakVariable = "123";
weakVariable = 456;
除此之外,Dart还支持使用var和final定义变量。其中var是根据赋值自动判断类型的,而final是定值不变的。另外,const是指定编译时常量的关键字。
2、函数
Dart中的函数是一等公民,它们可以像变量一样被传递和使用。下面是定义函数的示例:
int sum(int a, int b) {
return a + b;
}
可以使用箭头函数语法来简化函数的定义:
int sum(int a, int b) => a + b;
3、类
在Dart中,类是一种抽象数据类型,它定义了一个对象的状态和行为。下面是定义类的示例:
class Person {
String name;
int age;
Person(this.name, this.age);
void introduce() {
print("Hello, my name is $name, I'm $age years old.");
}
}
在上面的代码中,Person类有两个属性:name和age,一个构造函数和一个introduce方法。注意到构造函数是在类名后面使用this关键字定义的。此外,Dart有一个Object类,它是所有类的父类。
三、面向对象编程
1、继承
在Dart中,继承使用关键字extends。一个类只能继承一个父类。下面是继承的示例:
class Student extends Person {
double gpa;
Student(String name, int age, this.gpa)
: super(name, age);
@override
void introduce() {
super.introduce();
print("My GPA is $gpa.");
}
}
在上面的代码中,Student类继承了Person类,并且添加了一个gpa属性和一个introduce方法的重载。注意到在构造函数中通过调用super构造函数来初始化Person类中的属性。
2、接口
Dart中的接口是一种抽象类,定义了对象的行为,但没有实现。下面是定义接口的示例:
abstract class Shape {
double getArea();
}
在上面的代码中,Shape是一个抽象类,定义了getArea方法却没有实现。其他类可以实现Shape接口,并且必须实现getArea方法。
3、Mixin
Mixin是一种在不继承父类的情况下,为类添加行为的方式。下面是定义Mixin的示例:
mixin Jump {
void jump() {
print("Jump!");
}
}
class Animal {
void eat() {
print("Eat!");
}
}
class Rabbit extends Animal with Jump {
}
void main() {
var rabbit = Rabbit();
rabbit.eat();
rabbit.jump();
}
在上面的代码中,Jump是一个Mixin,定义了jump方法。Rabbit类继承自Animal类,使用关键字with引入了Jump Mixin。
四、异步编程
1、Future
Dart中的Future是一种表示异步操作结果的对象。下面是定义Future的示例:
Future
fetchData() {
return Future.delayed(Duration(seconds: 1), () => "Data loaded successfully.");
}
void main() async {
print("Fetch data start.");
var data = await fetchData();
print(data);
}
在上面的代码中,fetchData函数返回一个Future对象,使用Future.delayed模拟了异步请求的等待过程。在main函数中,使用await关键字等待fetchData函数返回的结果。
2、async/await
async和await是一种更简单的异步编程方式。使用async关键字定义一个异步函数,使用await等待一个异步操作完成。下面是使用async/await的示例:
Future
fetchData() {
return Future.delayed(Duration(seconds: 1), () => "Data loaded successfully.");
}
Future
loadData() async {
print("Start to load data.");
var data = await fetchData();
print(data);
}
void main() {
loadData();
}
在上面的代码中,loadData函数使用async关键字定义一个异步函数,使用await等待fetchData函数返回结果。
五、Flutter UI编程
1、Widget
在Flutter中,一切都是Widget。Widget是构建UI的基本元素,它可以是一个文本,图像,按钮,容器等等。下面是定义Widget的示例:
class MyText extends StatelessWidget {
final String content;
MyText(this.content);
@override
Widget build(BuildContext context) {
return Text(content);
}
}
void main() {
runApp(MaterialApp(
home: Scaffold(
body: Center(
child: MyText("Hello, Dart!"),
),
),
));
}
在上面的代码中,MyText是一个自定义的Widget,它继承自StatelessWidget类。build方法返回一个Text Widget来渲染文本内容。
2、Layout
在Flutter中,Layout是对Widget进行排列的一种方式。Flutter提供了许多Layout Widget,如Row、Column、Stack等。下面是使用Row和Column Layout的示例:
class MyAppBar extends StatelessWidget {
final String title;
MyAppBar(this.title);
@override
Widget build(BuildContext context) {
return Container(
height: 56.0,
padding: EdgeInsets.symmetric(horizontal: 8.0),
decoration: BoxDecoration(color: Colors.blue),
child: Row(
children:
[
IconButton(
icon: Icon(Icons.menu),
tooltip: 'Navigation menu',
onPressed: null,
),
Expanded(
child: Text(title),
),
IconButton(
icon: Icon(Icons.search),
tooltip: 'Search',
onPressed: null,
),
],
),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MyAppBar('Flutter Demo Home Page'),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children:
[
Text(
'You have pushed the button this many times:',
),
Text(
'0',
style: Theme.of(context).textTheme.display1,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: null,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
void main() => runApp(MaterialApp(
title: 'Flutter Tutorial',
home: MyHomePage(),
));
在上面的代码中,MyAppBar是一个自定义的Widget,它使用Row Widget对Navigation menu、标题和Search进行排列,而MyHomePage则使用了Column Widget对中间的文本进行排列。