在〈準備 Flutter 開發環境〉建立的第一個 Flutter 專案,其中的範例程式碼被我無視到現在,現在可以稍微回頭看一下它了,首先看看:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
現在看這段很簡單了,runApp 接受的 MyApp 是 StatelessWidget 子類,build 傳回了 MaterialApp,title 特性在 Android 的話,是在檢視「最近應用程式」時才會看得到,theme 是佈景主題設定,可以給予 MaterialApp 的元件整套的配色。
在〈準備 Flutter 開發環境〉說過,Android Studio 的範例專案運行後,右下有個 + 號按鈕,應用程式會顯示你按了幾次按鈕,按鈕按下會引發事件,而事件通常對狀態改變有關,保存狀態的 Widget 是 MyHomePage,也就是它繼承了 StatelfulWidget:
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
MyHomePage 有對應的 _MyHomePageState:
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
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, // 註冊 onPressed 處理器
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
在這邊看到 FloatingActionButton,這會建立一個浮動按鈕,內含一個 + 號的 Icon,提示文字為 'Increment',onPress 註冊的是按下按鈕後要執行的函式 _incrementCounter,其中呼叫 setState,指定的回呼函式執行後會遞增 _counter。
就現在來看這個範例,其實應該很簡單就可以看懂了吧!不過你可能會有問題的是,與〈自訂 StatefulWidget〉中實作 StatefulWidget 不同的是,MyHomePage 定義了建構式,命名參數上有個 key?這是幹嘛用的?
其實在這個範例專案中,這個 key 沒有什麼實際作用,因為 _MyHomePageState 的 build 建構的 Widget 中,並沒有子樹具有 StatefulWidget 的相關元件,在這個範例專案中,將建構式只定義為底下形式也是可以的:
class MyHomePage extends StatefulWidget {
MyHomePage({this.title});
...
不過建構 StatefulWidget 時是否指定 key,牽涉到 Widget 樹與 Element 樹之間,是否因應 Widget 樹的重新調整,Element 樹也要重新調整,這之後再來談。

