1. 程式人生 > >Flutter專案結構及demo程式碼詳解

Flutter專案結構及demo程式碼詳解

在之前的部落格中我們搭建了Flutter的開發環境,並且建立了一專案,專案預設就生成了一些程式碼,學習任何語言第一步一般都是從入口函式著手,然後一步一步往下走。
本篇部落格我們就以預設生成的專案為準,著重的介紹一下Flutter專案的目錄結構及程式碼詳解。

先來看看Flutter專案的目錄結構

在這裡插入圖片描述
我們著重需要注意一下幾個資料夾,其他的暫時不用理會

資料夾 作用
android android平臺相關程式碼
ios ios平臺相關程式碼
lib flutter相關程式碼,我們主要編寫的程式碼就在這個資料夾
test 用於存放測試程式碼
pubspec.yaml 配置檔案,一般存放一些第三方的依賴。

下面我們來看一下lib資料夾中的程式碼,lib中只有一個main.dart檔案。
通過英文註釋我們大概也能知道每個類是幹什麼的,有什麼作用,預設執行介面就是下圖這樣,點選浮動按鈕會改變計數Text的值。
在這裡插入圖片描述

下面我們來一點點的看,大家可以新建一個Flutter專案對照原本的程式碼看。

入口函式


首先是入口函式,main方法就是入口函式,預設的箭頭函式寫法跟下面寫法效果一致,返回一個widget,MyApp就是我們要展示的啟動介面。

/*
* 入口函式
*
* */
void main() => runApp(MyApp()); //Dart中的箭頭函式,跟kotlin很像,跟下面寫法效果一致
//main(){
//  return new MyApp();
//}

下面我們來看一下MyApp類,這裡的MyApp類中返回了一個MaterialApp widget,MaterialApp可以理解為ui的風格,Android上就是這種風格的UI. ios上我們可以使用CupertinoApp。這個可以自己修改嘗試
在MaterialApp中我們可以配置主題顏色,控制元件的樣式等等


/*
/*
* 這裡相當於Android中的Application類
* StatelessWidget表示無狀態控制元件
* */
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    /*
    * MaterialApp表明app的風格是Material Design風格的
    * 這裡我們可以配置app的主題相關屬性比如顏色,按鈕風格等等,類似於Android中的style檔案
    * */
    return MaterialApp(
      title: 'Flutter Demo',

      /*主題相關配置
      * 這裡我們可以配合app整體的主題樣式,比如整體顏色,控制元件預設的樣式等
      * */
      theme: ThemeData(
        /*這個地方就類似於Android中的style檔案配置,主要就是主題的配置*/
        primaryColor: Colors.red,
        primaryColorDark: Colors.red,
        accentColor: Colors.orange,
        buttonTheme: ButtonThemeData(buttonColor: Colors.red,textTheme: ButtonTextTheme.primary)
      ),

      /*home指定了啟動後顯示的頁面
      * 類似於我們在AndroidManifest中配置啟動頁面
      * */
      home: MyHomePage(title: 'Flutter示例'),
    );
  }
}

下面我們來看一下MyHomePage 類
MyHomePage 就是啟動後顯示的第一個頁面,繼承自StatefulWidget,註釋的很清楚,就不多說了。

/*
* StatefulWidget是一個有狀態的控制元件,如果你的頁面需要更新ui,那麼該頁面就要繼承自StatefulWidget
* 如果只是一個純展示的頁面,只需要繼承自StatelessWidget即可
* MyHomePage在上面已經被指定為啟動頁面
* 該頁面有一個計數的邏輯,會更新ui,所以需要繼承自StatefulWidget
* */
class MyHomePage extends StatefulWidget {
  /*Dart 中的構造方法  {}裡面的引數表示可選引數,跟kotlin概念差不多
  * this.title預設會把值賦給下面的title
  * */
  MyHomePage({Key key, this.title}) : super(key: key);

  /*宣告一個變數 用final修飾表示只能賦一次值
  * 在上面的構造上方法中已經有賦值操作了,所以後面我們就不能再更改title的值了
  * */
  final String title;

  /*所有繼承自StatefulWidget的控制元件都要重寫createState()這個方法
  * 可以理解為指定該頁面的狀態是由誰來控制的
  * 在Dart中下劃線開頭宣告的變數和方法,其預設訪問許可權就是私有的
  * 類似於java中用private關鍵字修飾,只能在類的內部訪問
  * */
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

_MyHomePageState 類中的程式碼稍微多一些。
我們自己新增了一個_reduceCounter方法,在setState中修改資料後,ui的狀態會自動更改。
然後我們添加了一個按鈕,並修改了Text的樣式,效果圖可以看下面


/*
*State是一個狀態物件,<>裡面是表示該狀態是跟誰繫結的。
* 我們修改狀態時就是在該類中進行編寫
*
* */
class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  /*計數器加一*/
  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  /*這裡我們自己新建一個方法,很簡單,就是執行減一操作*/
  void _reduceCounter() {
    setState(() {
      _counter--;
    });
  }

  @override
  Widget build(BuildContext context) {
/*Scaffold可以看作是Material Design中的一個模板
*看原始碼發現它繼承自StatefulWidget,包含了appBar,body,drawer等控制元件
* */
    return Scaffold(
      /*appBar 相當於Android中的ToolBar*/
      appBar: AppBar(
        /*這裡的widget實際上就是MyHomePage*/
        title: Text(widget.title),
      ),
      /*中間的內容佈局*/
      body: Center(
        /*Column表示一行 對應的Row表示一列
        * 這裡我們改成列看一下
        * */
        child: Column(
          /*mainAxisAlignment翻譯成中文就是主軸對準的意思。
          * 我們可以把值設定為star,end等等
          * */
          mainAxisAlignment: MainAxisAlignment.center,
          /*子控制元件,是一個List型別*/
          children: <Widget>[

            /*文字控制元件*/
            Text(
              '你點選的次數:',
              /*這裡我們可以修改樣式*/
              style: TextStyle(fontSize: 30,letterSpacing: 3),
            ),
            /*$_counter 用法跟kotlin中的${_counter}類似,*/
            Text(
              '$_counter',
              /*Text的樣式*/
              style: Theme.of(context).textTheme.display3,

            ),
            /*我們新增一個按鈕,用來實現點選使計數器減一*/
            RaisedButton(
              /*_reduceCounter是上面我們自己新增的方法,Dart中可以把方法作為引數傳遞*/
              onPressed: _reduceCounter,
              child: Text("減一"),
            )
          ],
        ),
      ),

      /*浮動按鈕*/
      floatingActionButton: FloatingActionButton(
        /*_incrementCounter實際上就是一個上面預設的_incrementCounter()方法,*/
        onPressed: _incrementCounter,
        tooltip: '計數器加一',
        child: Icon(Icons.add),
      ),

      // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

修改後執行效果圖如下

在這裡插入圖片描述

至此,Flutter預設專案中的目錄結構以及程式碼各自的作用就介紹完畢了,知道了程式碼的流程後我們就可以開始修改程式碼然後看看效果了,在Flutter中,一切皆widget,我們的介面都是由各種widget堆疊出來的,下一步我們就可以去學習一下Flutter中widget了。

需要demo的可以下載
Flutter預設專案demo