直接開始幹,沒有為什麼~
分析
Flutter 相關環境搭建好後,建立 Flutter 工程就可以看到官方這個預設的計數器Demo。
導包
這裡匯入Material UI庫
import 'package:flutter/material.dart';
複製程式碼
應用入口
-
main 函式作為程式入口,通過 runApp 啟動 Flutter 應用,傳入 Widget 引數(MyApp())。
-
=> 為 Dart 單行函式寫法。
void main() => runApp(MyApp());
複製程式碼
應用結構
-
這裡使用 MaterialApp 構建了個 Material 設計風格的應用 MyApp ,在 MaterialApp 中可以設定應用名、主題顏色、預設 Home 介面、語言、路由以及一些除錯開關等。
-
MyApp 繼承 StatelessWidget(無狀態元件),直接通過 Build 構建相應的 Widget
class MyApp extends StatelessWidget {
// 構建應用的根 Widget
@override
Widget build(BuildContext context) {
return MaterialApp(
// 多工視窗應用名字
title: 'Flutter Demo',
// 應用主題
theme: ThemeData(
primarySwatch: Colors.blue,
),
// 應用預設顯示的介面 Widget
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
複製程式碼
Home 頁實現
- MyHomePage 這個 Demo 真正的頁面實現,由 parent 傳入 title
- MyApp 繼承 StatefulWidget(有狀態元件),需要通過 createState 返回相應的 State
class MyHomePage extends StatefulWidget {
// title 由父類傳入,且設定成 final 不可改變
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
複製程式碼
- _MyHomePageState 繼承 State,泛型為 MyHomePage,通過 build 構建 Widget
class _MyHomePageState extends State<MyHomePage> {
// 記錄點選次數
int _counter = 0;
void _incrementCounter() {
// 呼叫 setState 將呼叫 build 重新繪製介面
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
// 構建 Widget
return Scaffold(
appBar: AppBar(
// appbar title.
title: Text(widget.title),
),
body: Center(
// Center 將子 Wiget 居中,這裡即螢幕居中
child: Column(
// Column 將一組子 Widget 豎向排列
mainAxisAlignment: MainAxisAlignment.center,
// 主軸方向居中
children: <Widget>[
// 子元件列表
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.display1,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
// 懸浮按鈕,按下改變 _counter 計數
);
}
}
複製程式碼
至此,計數 Demo 分析完畢...
總結
Flutter 中大多數物件都是 Widget,而在這些 Widget 的實現類裡都有其簡單的使用示例。看了這個 Demo 效果,裡面就使用到了如下 Widget :
- StatelessWidget
繼承自 Widget 的抽象類,當有一個不需要改變狀態的固定場景就可以繼承 StatelessWidget 實現,在 build 方法中巢狀實現 UI。StatelessWidget 與 StatefulWidget 對應
- StatefulWidget
繼承自 Widget 的 抽象類,當有一個需要改變狀態的場景就可以繼承 StatefulWidget 實現,在 createState 中返回需要的 State (繼承 State 實現)。 在繼承 State 後, 在 build 方法中巢狀實現 UI,在需要更新 UI 時 呼叫 setState 即可。 StatefulWidget 與 StatelessWidget 對應
- MaterialApp
MaterialApp 繼承自 StatefulWidget,實現一個 Material Design(材料設計)風格的 App
- Scaffold
Scaffold 繼承自 StatefulWidget,實現了基於材料設計的視覺化佈局結構,包含 appBar、body、drawer、 bottomNavigationBar 等
- AppBar
AppBar 繼承自 StatefulWidget,實現了材料設計的應用程式欄
- Center
Center 繼承自 Align 一步步跟蹤下去,它依然是繼承自 Widget,實現單一子部件居中顯示。
- Column
Column 繼承自 Flex 一步步跟蹤下去,它依然是繼承自 Widget,實現豎向陣列顯示 Widget
- Text
Text 繼承自 StatelessWidget ,實現單一風格文字控制元件
- FloatingActionButton
FloatingActionButton 繼承自 StatelessWidget,實現一個 Material Design(材料設計)風格的浮動按鈕元件
- Icon
FloatingActionButton 繼承自 StatelessWidget,實現一個 Material Design(材料設計)風格的圖示元件