Flutter系列文章-Flutter基礎

来源:https://www.cnblogs.com/depeng8899/archive/2023/07/17/17559946.html
-Advertisement-
Play Games

Flutter是Google推出的一種新的移動應用開發框架,允許開發者使用一套代碼庫同時開發Android和iOS應用。它的設計理念、框架結構、以及對Widget的使用,都讓開發者能更有效率地創建高質量的應用。 ...


Flutter是Google推出的一種新的移動應用開發框架,允許開發者使用一套代碼庫同時開發Android和iOS應用。它的設計理念、框架結構、以及對Widget的使用,都讓開發者能更有效率地創建高質量的應用。

一、Flutter設計理念

Flutter的設計理念是“一切皆為Widget”。這意味著不論是按鈕、字體、顏色、佈局,甚至是你的整個應用程式,都是由一個個Widget組合而成。在Flutter中,Widget可以嵌套、包裹或組合在一起,形成複雜的UI組件,這給了開發者極大的靈活性和創造力。

二、Flutter框架結構

Flutter框架由一系列層次結構構成。自底向上,主要包括:

  • Dart平臺:Flutter使用Dart語言編寫,Dart平臺包括一個能夠為Flutter生成原生ARM代碼的Dart JIT和AOT編譯器。

  • Flutter引擎:主要用C++編寫,它提供了低級渲染支持。它還負責插件系統、文本佈局和類型設置、網路和文件 I/O、線程管理等。

  • Foundation庫:提供了和Dart一致的基本類型和實用工具,使得其他更高級別的庫可以共用相同的設計和實現。

  • Widgets:描述應用程式用戶界面和交互的模塊。關鍵概念包括Widget、StatelessWidget、StatefulWidget、State等。

三、Flutter中的Widget

Flutter中的Widget即是聲明UI的視圖,也是視圖和界面變化的橋梁。一個Widget可以定義:

一個結構元素(如按鈕或菜單)
一個樣式元素(如字體或顏色模式)
甚至是佈局方面的元素(如填充或對齊方式)
在Flutter中,Widget的主要任務是提供一個build()方法,用於描述在UI中所看到的內容。

四、StatelessWidget和StatefulWidget

StatelessWidget是不可變的。它們描述了在給定配置下應該如何構建UI。而StatefulWidget則可以在生命周期內改變狀態。實現一個StatefulWidget至少需要兩個類:1)一個StatefulWidget類;2)一個State類。

五、基礎佈局Widgets

在Flutter中有很多佈局Widget,比如Row,Column和Stack等。Row和Column是基本佈局Widget,它們都接受一列子Widget,併在水平或垂直方向上排列。Stack可以將Widget堆疊在一起,實現各種複雜的佈局。

六、Flutter程式結構

一個基本的Flutter程式通常包括以下部分:

  • main函數:應用的入口點。
  • MyApp類:StatelessWidget,返回一個包含應用主題、路由和主頁的MaterialApp Widget。
  • 主頁類:可為StatelessWidget或StatefulWidget,包含應用主體部分。
  • 其他Widget類:你自定義的Widget,可被主頁類或其他Widget類使用。
    掌握了這些基礎知識,你就能更好地使用Flutter框架進行應用開發,創建出精美並具有良好用戶體驗的應用程式。

七、Flutter的Widget

7.1. 基礎Widgets

在Flutter中,所有的界面元素都是由Widget構建的。每一個Widget都描述了界面上應該看到什麼。你可以把Widget看作是應用界面的一個構建塊。它們包括用於顯示文字、圖片、圖標、輸入框以及行為等的元素。

7.1.1 Text:這個widget用於顯示簡單的樣式文本,它包含一些控制文本顯示樣式的屬性。####

Text(
  'Hello, World!',
  textAlign: TextAlign.center,
  style: TextStyle(fontWeight: FontWeight.bold),
)

7.1.2 Image:用於顯示圖片的widget,支持多種方式的圖片載入,例如網路、資源、文件系統等。

Image.network('https://example.com/images/sample.jpg')

7.1.3 Icon:Material Design的圖標widget。

Icon(Icons.star, color: Colors.red[500])

7.2. Widget類型:StatelessWidget和StatefulWidget。

7.2.1. StatelessWidget

StatelessWidget是不可變的,它描述了在給定配置下應該如何構建UI。例如,下麵的代碼展示瞭如何創建一個自定義的StatelessWidget,它返回一個紅色的星星圖標:

class MyIcon extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Icon(Icons.star, color: Colors.red[500]);
  }
}

7.2.2. StatefulWidget

StatefulWidget是動態的。它們可以在生命周期內改變狀態,例如響應用戶的交互。一個StatefulWidget至少需要兩個類:StatefulWidget類和State類。以下是一個例子:

class Counter extends StatefulWidget {
  Counter({Key key, this.title}) : super(key: key);

  final String title;

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

class _CounterState extends State<Counter> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Text('You have pushed the button $_counter times.'),
        RaisedButton(
          onPressed: _incrementCounter,
          child: Text('Increment'),
        ),
      ],
    );
  }
}

這個例子創建了一個名為Counter的新StatefulWidget。每當用戶按下"Increment"按鈕時,_counter 的值就會增加,並且UI會自動更新。

八、Flutter的基本佈局Widgets

在Flutter中,我們有許多預定義的佈局Widget,例如Row、Column和Stack。

8.1. Row和Column

Row和Column是兩個最常用的佈局Widget。它們都接受一列子Widget,併在水平或垂直方向上排列。以下是一個使用Row的例子,它包含了三個紅色的星星圖標:

Row(
  mainAxisAlignment: MainAxisAlignment.spaceAround,
  children: <Widget>[
    Icon(Icons.star, color: Colors.red[500]),
    Icon(Icons.star, color: Colors.red[500]),
    Icon(Icons.star, color: Colors.red[500]),
  ],
)

8.2. Stack

Stack是一個佈局Widget,它可以將子Widget堆疊在一起。你可以使用Positioned widget來定位Stack中的子Widget。以下是一個簡單的Stack示例:

Stack(
  alignment: const Alignment(0.6, 0.6),
  children: [
    CircleAvatar(
      backgroundImage: AssetImage('images/pic.jpg'),
      radius: 100.0,
    ),
    Container(
      decoration: BoxDecoration(
        color: Colors.black45,
      ),
      child: Text(
        'Hello World',
        style: TextStyle(
          fontSize: 20.0,
          fontWeight: FontWeight.bold,
          color: Colors.white,
        ),
      ),
    ),
  ],
)

九、下麵我們創建一個Flutter的示例應用,包括之前提到的一些關鍵概念,包括Widget,StatelessWidget,StatefulWidget,以及Row,Column和Stack佈局。

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'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final String title;

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

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

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  void _decrementCounter() {
    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.headline4,
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: <Widget>[
                FloatingActionButton(
                  onPressed: _incrementCounter,
                  tooltip: 'Increment',
                  child: Icon(Icons.add),
                ),
                FloatingActionButton(
                  onPressed: _decrementCounter,
                  tooltip: 'Decrement',
                  child: Icon(Icons.remove),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

通過這篇文章,你應該對Flutter有了一個基礎的理解,包括Flutter的設計理念、框架結構、Widget系統、以及如何使用不同類型的Widgets來創建界面和佈局。接下來,我們會深入到更高級的主題,包括如何處理用戶交互,如何創建動畫,以及如何訪問網路數據等等。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## 跟運維學 Linux - 01 ### 運維的誕生 運維工程師有很多叫法:系統運維、Linux 工程師、系統管理員... `網管`可以說是運維工程師最早的雛形。在個人電腦未普及時,大家去網吧玩游戲。 玩家:“網關,我的電腦上不了網了” 網管負責維修電腦、維修系統、維護網路設備... ### 互 ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202307/3076680-20230717125930891-211733509.png) # 1. 計算同一組或分區的行之間的差 ## 1.1. 最終結果集 ### 1.1.1. sql ```sql D ...
  • 一、DQL介紹 DQL全稱:Data Query Language(數據查詢語言),用來查詢資料庫中表的記錄。 關鍵字:select 二、DQL語法 select 欄位列表 from 表名列表 where 條件列表 group by 分組欄位列表 having 分組後條件列表 order by 排序 ...
  • Oracle資料庫 在Oracle資料庫中,''(空字元串)與null是什麼關係呢? ''(空字元串)是否會等同(或者說等價於)於null值呢?''跟' '(長度為零的空字元串或包含一個或多個空格的空字元串)是否又等價?下麵我們測試一下 SQL> create table test(id numbe ...
  • 魔笛活動平臺要記錄每個活動的用戶行為數據,幫助客服、運營、產品、研發等快速處理客訴、解決線上問題併進行相關數據分析和報警。可以預見到需要存儲和分析海量數據,預估至少幾十億甚至上百億的數據量,所以需要選擇一款能存儲海量數據的資料庫。由於是通過接收MQ存儲或者API方式存儲,所以對實時寫入性能也有一定要... ...
  • - 1. GIPKs特性簡介 - 2. GIPKs特性的作用 - 3. 玩轉GIPKs > GIPKs解決了歷史難題 ## 1. GIPKs特性簡介 從MySQL 8.0.30開始,新引入一個叫做GPIKs的特性,其全稱是 **Generated Invisible Primary Keys**,簡 ...
  • 近日,工業和信息化部發佈了2023年第2批侵害用戶權益行為的App(SDK)名單,55款App因涉及強制、頻繁、過度索取許可權等問題而被通報。這一舉措進一步凸顯了合規對於APP發展的重要性。 根據工業和信息化部的通報,被通報的這些App存在著一些消費者難以察覺的問題,如頻繁自啟動和關聯啟動、超範圍索權 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 TypeScript是一種由微軟開發的自由和開源的編程語言。它是JavaScript的一個超集,而且本質上向這個語言添加了可選的靜態類型和基於類的面向對象編程。 一、! 非空斷言操作符 在上下文中當類型檢查器無法斷定類型時,一個新的尾碼表 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...