學習 Flutter 系列(三):App開發藍圖設計

更新 發佈閱讀 11 分鐘
raw-image

當你開始進行 Flutter App開發時,設計清晰的應用藍圖至關重要。無論是專案結構的規劃,還是模組化的代碼設計,都能幫助你打造高效、易維護的應用程式。本文將從專案結構、Dart 命名約定、模組化思維等方面進行解析,並通過範例深入講解 StatelessWidget 和 StatefulWidget 的實際應用。

1️⃣ Flutter 專案結構

Flutter 預設的專案結構簡單直觀,了解其組織方式和最佳實踐,能幫助你更高效地管理代碼。

(1)資料夾結構

Flutter 專案的主要資料夾和文件包括:

  • lib/:核心代碼存放處,是應用程式的主文件夾。
    • main.dart:應用的入口文件。
    • 其他子目錄建議:
      • screens/:存放各個頁面(Screen)。widgets/:存放可重複使用的 Widget。
      • models/:存放業務邏輯中用到的數據模型。services/:存放與後端交互的功能(例如 API 調用)。
  • android/ 和 ios/:分別存放 Android 和 iOS 的原生代碼,適合用來配置權限或整合第三方插件。
  • pubspec.yaml:配置文件,用於管理應用資源和第三方依賴,例如引入圖標、字體、套件等。


💡 提示:保持資料夾結構清晰,便於日後維護和擴展。


(2)Dart 專案結構與命名約定

  • 文件命名:使用小寫且用下劃線分隔,例如 my_widget.dart。
  • 類名命名:遵循駝峰命名法(PascalCase),如 MyHomePage。
  • 變量和方法命名:使用小駝峰命名法(camelCase),如 onButtonPressed。
  • 常量命名:使用全大寫和下劃線分隔,例如 MAX_COUNT。


💡 良好的命名習慣能提升代碼的可讀性,特別是在多人協作時。


(3)預設 Template 解析

新建專案後,Flutter 提供了一個預設範例模板。以下是模板中關鍵部分的解析:

1. 導入 Library

import 'package:flutter/material.dart';

  • flutter/material.dart 是預設的 Material Design 樣式庫,提供了豐富的 UI 元素和布局工具。

2. 應用入口

void main() {

  runApp(const MyApp());

}


  • main() 方法是 Dart 的程序入口。
  • runApp() 方法加載根組件,並啟動應用程式。

3. MyApp 應用結構

class MyApp extends StatelessWidget {

  @override

  Widget build(BuildContext context) {

    return MaterialApp(

      title: 'Flutter Demo',

      theme: ThemeData(primarySwatch: Colors.blue),

      home: const MyHomePage(title: 'Flutter Demo Home Page'),

    );

  }

}


  • MaterialApp:Flutter 應用的入口組件,負責應用的全局設置(如主題、路由)。
  • home:指定應用的首頁組件。

4. MyHomePage

class MyHomePage extends StatefulWidget {

  final String title;

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

  @override

  State<MyHomePage> createState() => _MyHomePageState();

}

  • StatefulWidget:用於有狀態的組件(如需要更新界面的組件)。
  • title:通過構造函數接收參數,靈活定義頁面屬性。

5. State

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>[

            const Text('You have pushed the button this many times:'),

            Text('$_counter', style: Theme.of(context).textTheme.headline4),

          ],

        ),

      ),

      floatingActionButton: FloatingActionButton(

        onPressed: _incrementCounter,

        tooltip: 'Increment',

        child: const Icon(Icons.add),

      ),

    );

  }

}


  • 狀態管理:通過 setState() 觸發界面刷新,更新 _counter 的值並重繪組件。
  • Scaffold:提供 Material Design 的頁面結構,包括 AppBar、Body 和 FloatingActionButton。


2️⃣ Flutter 模組化與重用

模組化設計能讓應用程式更易於維護和擴展。以下是模組化設計的核心思維與實踐。

(1)模組化思維

  • 功能分離:將應用分為多個模組,每個模組負責單一功能(例如用戶驗證、數據展示)。
  • 代碼重用:將可重複使用的組件(如按鈕、卡片)封裝成獨立的 Widget。

(2)Widget 的層次結構與組合模式

Flutter 的 UI 是由 Widget 層層組合而成。合理的層次結構能提升代碼的可讀性和可維護性:

Widget 層次結構圖

----------------

Container

└── ColoredBox

    └── Column / Row

        ├── Image

        ├── Text

        ├── RawImage

        └── RichText


解釋層次結構:

  1. Container:
    • Flutter 中最常用的 Widget,用於包裹其他 Widget。
    • 可以設置邊距、對齊方式、背景顏色等。
    • 它通常作為頂層容器。
  2. ColoredBox:
    • 用於設置背景色,比 Container 更輕量,但無法設置其他屬性(如邊框或邊距)。
    • 適合純粹需要設置背景顏色的情況。
  3. Row / Column:
    • 用於排列子 Widget,Row 是水平排列,Column 是垂直排列。
    • 它們是組織多個子 Widget 的核心布局工具。
  4. Image:
    • 用於顯示圖片,支持多種圖片來源(如網絡圖片、本地圖片)。
  5. Text:
    • 用於顯示簡單文字,支持樣式(如字體大小、顏色等)設置。
  6. RawImage:
    • 一個底層的圖片 Widget,直接渲染圖片數據,適合處理自定義圖片數據的場景。
  7. RichText:
    • 用於顯示富文本(多樣式的文字),支持字體、顏色和樣式的混合設置。

輸出效果:

  • Container:作為背景容器,設置灰色背景和內邊距。
  • ColoredBox:設置白色背景,包裹內容。
  • Row:水平排列 Image、Text 和 RichText。
  • Image:展示 Flutter 官方 LOGO。
  • Text:顯示簡單文字。
  • RichText:顯示富文本,支持多樣式文字。


這樣的層次結構非常適合處理複雜的界面布局,並且每層 Widget 都有清晰的職責,便於維護和擴展。


(3)範例解析:StatelessWidget 和 StatefulWidget

StatelessWidget


  • 特點:無內部狀態,適合靜態界面。

範例:

class MyTitle extends StatelessWidget {

  final String title;

  MyTitle({required this.title});

  @override

  Widget build(BuildContext context) {

    return Text(

      Title,

      style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),

    );

  }

}


  •  用途:顯示靜態標題文字。

StatefulWidget

  • 特點:有內部狀態,適合需要更新界面的組件。

範例:

class CounterWidget extends StatefulWidget {

  @override

  _CounterWidgetState createState() => _CounterWidgetState();

}

class _CounterWidgetState extends State<CounterWidget> {

  int _counter = 0;

  void _incrementCounter() {

    setState(() {

      _counter++;

    });

  }

  @override

  Widget build(BuildContext context) {

    return Column(

      mainAxisAlignment: MainAxisAlignment.center,

      children: [

        Text("Counter: $_counter", style: TextStyle(fontSize: 20)),

        ElevatedButton(

          onPressed: _incrementCounter,

          child: Text("Increment"),

        ),

      ],

    );

  }

}


  •  用途:動態計數器,可根據按鈕點擊更新界面。


如何選擇?


raw-image


結語:清晰的設計是成功的基石

學習 Flutter 專案結構、掌握模組化設計和充分理解 StatelessWidget 與 StatefulWidget,能幫助你打造高效的應用程式。透過合理的組件劃分與代碼重用,你的應用將更加靈活、易於維護。

立即應用這些技巧,為你的 Flutter 項目畫下完美的開發藍圖吧! 🚀


留言
avatar-img
留言分享你的想法!
avatar-img
Digiworld的沙龍
12會員
317內容數
Digiworld的沙龍的其他內容
2025/04/18
3 個簡單卻高效的方法,幫助你提升 CTR,讓廣告真正吸引潛在客戶,避免讓錢白白打水漂!
Thumbnail
2025/04/18
3 個簡單卻高效的方法,幫助你提升 CTR,讓廣告真正吸引潛在客戶,避免讓錢白白打水漂!
Thumbnail
2025/04/09
到了2025年,網頁設計已經進入一個全新的階段,AI工具變成中小企業跟網店賣家的最佳幫手!不管你是想做一個超專業的國際網店,還是只要一個簡單的個人網站,完全不用學寫程式,只要30分鐘就能用ChatGPT 4o搞定一個超漂亮的網頁!
Thumbnail
2025/04/09
到了2025年,網頁設計已經進入一個全新的階段,AI工具變成中小企業跟網店賣家的最佳幫手!不管你是想做一個超專業的國際網店,還是只要一個簡單的個人網站,完全不用學寫程式,只要30分鐘就能用ChatGPT 4o搞定一個超漂亮的網頁!
Thumbnail
2025/03/09
隨著 AI 與自動化技術的普及,美容業正迎來一場革命。想實現銷售額的倍增,現在就花幾分鐘一起探討如何利用自動化技術改造美容業務吧~
Thumbnail
2025/03/09
隨著 AI 與自動化技術的普及,美容業正迎來一場革命。想實現銷售額的倍增,現在就花幾分鐘一起探討如何利用自動化技術改造美容業務吧~
Thumbnail
看更多
你可能也想看
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
# 簡介 身為一位專注於 Vue.js 的前端開發者,這是我第一次嘗試構建 Flutter 網頁應用。讓我們開始吧! ## 第一次嘗試 ### 第一步:創建一個 Flutter 應用 首先,通過運行以下命令來創建一個新的 Flutter 項目: ```sh flutter
Thumbnail
# 簡介 身為一位專注於 Vue.js 的前端開發者,這是我第一次嘗試構建 Flutter 網頁應用。讓我們開始吧! ## 第一次嘗試 ### 第一步:創建一個 Flutter 應用 首先,通過運行以下命令來創建一個新的 Flutter 項目: ```sh flutter
Thumbnail
本篇文章將分享手機App設計教學,並往後介紹使用Flutter開發App的相關知識和技巧。透過這系列的分享,讀者將能夠學習如何利用設計和程式開發技能來製作一個App。文章中也提供了一些靈感來源和教學資源,幫助讀者進行設計和開發的思考和學習。
Thumbnail
本篇文章將分享手機App設計教學,並往後介紹使用Flutter開發App的相關知識和技巧。透過這系列的分享,讀者將能夠學習如何利用設計和程式開發技能來製作一個App。文章中也提供了一些靈感來源和教學資源,幫助讀者進行設計和開發的思考和學習。
Thumbnail
列出一套完整的程式 程式設計有許多種方法,不過通常會先列出清單的再逐一執行,這樣會加快程式設計的速度。設計通常會採取順推的辦法。所以順推的程式設計方式就是經歷觀念溝通、系統分析、資料統合、權限管理、頻率與時間、後台管理、畫面設計等等階段後,將框架設計完了以後,先列出一套完整的程式,將所有使用者都確
Thumbnail
列出一套完整的程式 程式設計有許多種方法,不過通常會先列出清單的再逐一執行,這樣會加快程式設計的速度。設計通常會採取順推的辦法。所以順推的程式設計方式就是經歷觀念溝通、系統分析、資料統合、權限管理、頻率與時間、後台管理、畫面設計等等階段後,將框架設計完了以後,先列出一套完整的程式,將所有使用者都確
Thumbnail
程式設計中不可或缺的一部分 介面是使用者與程式互動的媒介,因此介面的設計會影響使用者的體驗和感受。一個清晰明白、易懂的介面,可以讓使用者輕鬆地使用程式,並獲得良好的使用體驗。 需要與程式設計師密切溝通 設計師需要了解程式的功能和需求,並根據使用者的習慣和需求進行設計。設計師和程式設計師之間的溝
Thumbnail
程式設計中不可或缺的一部分 介面是使用者與程式互動的媒介,因此介面的設計會影響使用者的體驗和感受。一個清晰明白、易懂的介面,可以讓使用者輕鬆地使用程式,並獲得良好的使用體驗。 需要與程式設計師密切溝通 設計師需要了解程式的功能和需求,並根據使用者的習慣和需求進行設計。設計師和程式設計師之間的溝
Thumbnail
有沒有想過,即使沒有任何編程背景,你的創意也能在六個月內轉化成真實的App?我可以以自身經歷跟你說有了 No-Code Tool (無代碼工具) 和 AI 的幫助,這一切都是可能的!你一行 code 都不需要打,甚至也無須學習任何編程語言!沒有什麼比實踐一個自小認為不可能的任務還振奮人心的事了!
Thumbnail
有沒有想過,即使沒有任何編程背景,你的創意也能在六個月內轉化成真實的App?我可以以自身經歷跟你說有了 No-Code Tool (無代碼工具) 和 AI 的幫助,這一切都是可能的!你一行 code 都不需要打,甚至也無須學習任何編程語言!沒有什麼比實踐一個自小認為不可能的任務還振奮人心的事了!
Thumbnail
本課程學習如何在 Kotlin 程式碼檔案中,設定 ImageView 圖片元件,顯示本地端圖片。
Thumbnail
本課程學習如何在 Kotlin 程式碼檔案中,設定 ImageView 圖片元件,顯示本地端圖片。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News