一、語言概述
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對中間的文本進行排列。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/198445.html