【Flutter 1.5】Flutter的按鈕動作 - FloatingActionButton
接下來,我們要進入按鈕動作的世界了,先介紹FloatingActionButton,其實Android的也叫FloatingActionButton,想想這也沒錯,降低Android開發者的學習曲線。我們現在就來看看吧。
FloatingActionButton
說明
名稱 | 說明 | 重點 |
---|---|---|
StatelessWidget | 狀態不變的 (點了也沒有反應) | Widget build(BuildContext context) |
StatefulWidget | 狀態可變的 (可以被點擊之類的) | @override State createState() |
State | 點擊之類的反應 | setState(fn) |
程式碼
- 請各位允許我使用比較不專業的術語解說吧,在程式中看得出來除了StatelessWidget(按了有反應) / StatefulWidget(按了沒反應)是Widget之外,State也是Widget,而State<MyHomePage>就是指針對MyHomePage的狀態,所以主要的重點就在『_incrementCounter()』這支函數身上,利用setState(fn)去產生點擊的反應。接下來,就請各位用心去體會Flutter的發明者為什麼要這樣分類呢?不就全部都用StatefulWidget就好了嗎?針對Widget的使用上的選擇,也許可以參考一下這篇文章才是。
// main.dart
import 'package:flutter/material.dart';
// 程式進入點 => void main() { return runApp(FloatingActionButtonDemoApp()); }
void main() => runApp(FloatingActionButtonDemoApp());
// Main Class => StatelessWidget (狀態不變的) => build() (建立Widget)
class FloatingActionButtonDemoApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'FloatingActionButton範例',
theme: ThemeData(primarySwatch: Colors.blue,), // theme: MaterialApp的佈景主題
home: MyHomePage(title: 'FloatingActionButton範例'),
debugShowCheckedModeBanner: false, // debugShowCheckedModeBanner: 讓右上角的Debug圖示消失
);
}
}
// Sub Class => StatefulWidget (狀態可變的) => createState() (狀態的回傳值)
class MyHomePage extends StatefulWidget {
final String title;
MyHomePage({Key key, this.title}) : super(key: key); // MyHomePage(): 初始化語法
@override
_MyHomePageState createState() => _MyHomePageState(); // 箭頭語法: _MyHomePageState createState() { return _MyHomePageState(); }
}
// Sub Class => State (設定狀態) => setState(fn) (使用它來改變數值) => onPressed: _incrementCounter (函數名稱)
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(widget.title),),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('看看你按了幾次:',), // 變數: $_counter / ${_counter}
Text('$_counter',style: Theme.of(context).textTheme.display1,),
],
),
),
floatingActionButton: FloatingActionButton( // FloatingActionButton: 浮動按鈕
onPressed: _incrementCounter, // 按下觸發的方式名稱: void _incrementCounter()
tooltip: '加1加1', // 按住按鈕時出現的提示字
child: Icon(Icons.add),
),
);
}
// 按一下就加1
void _incrementCounter() {
setState(() { _counter+=1; });
}
}