【Flutter 學習筆記】深入了解 Flutter 的 StatefulWidget:計數器應用程式

閱讀時間約 8 分鐘
raw-image
【Flutter 學習筆記】🎬 教學影片:連結
【Flutter 學習筆記】📚 文章目錄:連結

今天我們要深入探討 Flutter 中的 StatefulWidget,也就是有狀態的 Widget。在這篇文章中,我將帶領大家逐步了解一個基本的計數器應用程式,並解釋每個部分的功能與用途。

什麼是 StatefulWidget?

在前幾堂課中,我們介紹了如何使用 Empty 範本建立全新的 Flutter 專案,並得到了簡單的 "Hello World" 應用程式。這個應用程式僅顯示純文字,沒有任何互動或 UI 更新,因此我們使用了 StatelessWidget(無狀態的 Widget)。

然而,當我們選擇 Application 範本來建立新的 Flutter 應用程式時,會附帶一個計數器的功能。在這種情況下,我們需要使用 StatefulWidget,因為計數器的數字會隨著使用者的點擊而變化,這需要動態更新 UI。

建立計數器應用程式

接下來,我們使用 Application 範本來建立一個基本的計數器應用程式。首先,讓我們來看看程式的結構。

1. main 函數

void main() {
runApp(MyApp());
}

這是程式的進入點,使用 runApp 函數來啟動應用程式,並傳入 MyApp 類別。

2. MyApp 類別

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(title: '計數器應用程式'),
);
}
}

MyApp 類別繼承自 StatelessWidget,表示這是一個不需要管理狀態的 Widget。在 build 方法中,我們回傳了一個 MaterialApp,並設定 home 參數為 MyHomePage,這是我們的主頁面。

3. MyHomePage 類別

class MyHomePage extends StatefulWidget {
final String title;

MyHomePage({Key? key, required this.title}) : super(key: key);

@override
_MyHomePageState createState() => _MyHomePageState();
}

MyHomePage 類別繼承自 StatefulWidget,因為我們的計數器需要管理狀態。這裡我們定義了一個 title 屬性,用來顯示在 AppBar 上的標題文字,並使用 required 關鍵字來強制要求這個參數。

4. _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('你已經按了這個按鈕這麼多次:'),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: '增加',
child: Icon(Icons.add),
),
);
}
}

在 _MyHomePageState 類別中,我們定義了幾個重要的元素:

  • _counter 變數:用來暫存按鈕被點擊的次數。_incrementCounter() 方法:當按鈕被點擊時觸發,使用 setState() 更新計數器的值,並重新渲染畫面。build 方法:定義 UI 結構的地方,使用 Scaffold 作為基本頁面的框架,並包含 AppBar、body 和 FloatingActionButton。

5. UI 結構

在 build 方法中,我們使用了以下幾個 Widget:

  • Scaffold:這是 Flutter 提供的基本頁面框架,包含了應用程式的主要結構。
  • AppBar:用來顯示應用程式的標題列,這裡我們將 title 設定為 widget.title,這樣可以顯示在 MyHomePage 中傳入的標題。
  • body:這是頁面的主要內容區域,我們使用 Center Widget 來將內容置中顯示,並使用 Column Widget 來垂直排列內容。
  • Text Widget:我們使用了兩個 Text Widget。第一個顯示說明文字,第二個顯示計數器的數字,這裡使用了 _counter 變數來顯示當前的計數值。
  • FloatingActionButton:這是畫面右下角的浮動按鈕,當使用者點擊時,會呼叫 _incrementCounter 方法,增加計數器的值。

6. 整體流程

當使用者點擊浮動按鈕時,以下流程會發生:

  • _incrementCounter() 方法被呼叫。在這個方法中,我們使用 setState() 來更新 _counter 的值,這會告訴 Flutter 需要重新渲染畫面。當畫面重新渲染時,build 方法會被再次呼叫,並更新顯示的計數器數字。

這就是 Flutter 中 StatefulWidget 的基本結構與運作方式。透過這個計數器應用程式,我們可以清楚地看到如何管理狀態,以及如何讓 UI 隨著狀態的變化而更新。

avatar-img
10會員
232內容數
哈囉!歡迎光臨我的沙龍!我是 KT,一位對應用程式開發充滿熱情的開發者。在這個專屬空間,我將與您分享我在應用開發領域的深入學習心得和豐富的實戰經驗。如果您對應用程式開發技術同樣充滿好奇,渴望不斷探索新知,歡迎成為我們的會員,一起在應用程式開發的旅途上,探索更深層次的技術世界,享受學習的樂趣。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
HKT實驗室 的其他內容
本篇文章探討 Flutter 中的 Text 文字元件及其內部屬性。學習如何查看 Text 元件的原始碼,補充介紹位置參數與具名參數。
在這篇文章中,我們深入探討 Flutter 中的 Text 元件,這是一個用於顯示文字的基本組件。無論是純文字顯示、字體樣式的設定,還是多行顯示,Text 元件都能輕鬆應對。
本課程介紹了如何建立第一個 Flutter 應用程式。學習內容包括匯入 Flutter 套件、定義主函數、建立無狀態的 Widget 類別 MainApp,以及使用 Scaffold 和 Center 來組織 UI 元件。最終,學員能夠編譯並執行一個顯示「HKT 線上教室」的簡單應用程式。
在 Dart 程式語言中,除了位置參數和預設參數值外,具名參數的使用讓函式的呼叫變得更加清晰且易於理解。特別是在參數較多的情況下,具名參數的優勢尤為明顯。本篇文章將深入探討如何定義和使用具名參數,並透過實際範例來加深讀者的理解。
在 Dart 程式語言中,函式不僅可以接收參數,還能為這些參數設定預設值。這樣的設計使得函式的呼叫更加靈活,並且簡化了程式碼的撰寫。本文將深入探討如何定義具有預設參數值的函式,並透過實際範例來加深理解。
在 Dart 程式語言中,函式不僅能執行特定任務,還能回傳值,這使得函式在程式中更具彈性和重用性。本篇文章將深入探討如何定義一個具有回傳值的函式,並透過實際範例來幫助大家理解其結構與用途。
本篇文章探討 Flutter 中的 Text 文字元件及其內部屬性。學習如何查看 Text 元件的原始碼,補充介紹位置參數與具名參數。
在這篇文章中,我們深入探討 Flutter 中的 Text 元件,這是一個用於顯示文字的基本組件。無論是純文字顯示、字體樣式的設定,還是多行顯示,Text 元件都能輕鬆應對。
本課程介紹了如何建立第一個 Flutter 應用程式。學習內容包括匯入 Flutter 套件、定義主函數、建立無狀態的 Widget 類別 MainApp,以及使用 Scaffold 和 Center 來組織 UI 元件。最終,學員能夠編譯並執行一個顯示「HKT 線上教室」的簡單應用程式。
在 Dart 程式語言中,除了位置參數和預設參數值外,具名參數的使用讓函式的呼叫變得更加清晰且易於理解。特別是在參數較多的情況下,具名參數的優勢尤為明顯。本篇文章將深入探討如何定義和使用具名參數,並透過實際範例來加深讀者的理解。
在 Dart 程式語言中,函式不僅可以接收參數,還能為這些參數設定預設值。這樣的設計使得函式的呼叫更加靈活,並且簡化了程式碼的撰寫。本文將深入探討如何定義具有預設參數值的函式,並透過實際範例來加深理解。
在 Dart 程式語言中,函式不僅能執行特定任務,還能回傳值,這使得函式在程式中更具彈性和重用性。本篇文章將深入探討如何定義一個具有回傳值的函式,並透過實際範例來幫助大家理解其結構與用途。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
此文件的目的是教授 Kotlin 程式語言的運算符,包括算數運算子、比較運算子、賦值運算子、位元運算子以及運算子的優先等級。這將有助於讀者更好地理解和撰寫 Kotlin 程式碼。
Thumbnail
本課程學習如何提取共同屬性,透過 Style 樣式包,套用至每個按鈕。來提升佈局的可讀性和好維護性。
Thumbnail
本課程學習如何如何實作計算機介面,佈局文字元件及按鈕。學習使用 LinearLayout 垂直排列元件,調整背景色。透過 GridLayout 佈局計算機按鈕。
您將學到如何利用 MVVM 架構來開發一個計數器應用程式。您將了解 ViewModel 的作用和用法,以及如何使用 LiveData 來實現資料的動態更新。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
此文件的目的是教授 Kotlin 程式語言的運算符,包括算數運算子、比較運算子、賦值運算子、位元運算子以及運算子的優先等級。這將有助於讀者更好地理解和撰寫 Kotlin 程式碼。
Thumbnail
本課程學習如何提取共同屬性,透過 Style 樣式包,套用至每個按鈕。來提升佈局的可讀性和好維護性。
Thumbnail
本課程學習如何如何實作計算機介面,佈局文字元件及按鈕。學習使用 LinearLayout 垂直排列元件,調整背景色。透過 GridLayout 佈局計算機按鈕。
您將學到如何利用 MVVM 架構來開發一個計數器應用程式。您將了解 ViewModel 的作用和用法,以及如何使用 LiveData 來實現資料的動態更新。