Flutter 探索(四)工程文件目錄結(jié)構(gòu)及 main.dart

目錄


成功運行了第一個項目棺克,那么這一節(jié)我們來了解一下 Flutter 的文檔目錄一死,以及默認(rèn)模板工程-計數(shù)器的 main 文件 绑莺。


計數(shù)器 Demo.png

Flutter 工程文件目錄結(jié)構(gòu)

工程文件目錄.png
文件 說明
android Android 平臺相關(guān)代碼
ios iOS 平臺相關(guān)代碼
lib Flutter 相關(guān)代碼,主要代碼存放在這里
main.dart 工程入口文件
test 測試代碼
pubspec.yaml 配置文件绍绘,一般存放一些第三方庫的代碼

Flutter 入口 main.dart 文件

main.dart 是整個項目的入口,一切從這里開始末早。

入口方法
import 'package:flutter/material.dart';
//導(dǎo)入的包路徑

void main() {
  runApp(MyApp());
}
  • main() 方法是 Dart 的入口方法
  • runApp() 方法是 Flutter 的入口方法
  • MyApp() 是工程打開的第一個組件
根組件

在 Flutter 中所有 UI 都是由組件(Widget)構(gòu)成的赎婚,所以主頁面也就是一個組件(Widget)。

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // This is the theme of your application.
        //
        // Try running your application with "flutter run". You'll see the
        // application has a blue toolbar. Then, without quitting the app, try
        // changing the primarySwatch below to Colors.green and then invoke
        // "hot reload" (press "r" in the console where you ran "flutter run",
        // or simply save your changes to "hot reload" in a Flutter IDE).
        // Notice that the counter didn't reset back to zero; the application
        // is not restarted.
        primarySwatch: Colors.blue,
        // This makes the visual density adapt to the platform that you run
        // the app on. For desktop platforms, the controls will be smaller and
        // closer together (more dense) than on mobile platforms.
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}
  • class MyApp:該組件名稱玖像,也是類名紫谷。
  • extends StatelessWidget:繼承的組件為 StatelessWidget,該組件后面具體講捐寥。
  • Widget build(BuildContext context):StatelessWidget 組件的方法碴里,在這里返回的即為 MyApp 組件的布局。
  • MaterialApp:這是一個 Material Design 風(fēng)格的根控件上真,如果我們想使用其他已經(jīng)封裝好的 Material Design 風(fēng)格的 Widget,就必須使用 MaterialApp羹膳。
  • title睡互、themehome:組件可以設(shè)置的屬性陵像,與 js 中屬性相似就珠。
  • home:Widget 類型,主界面
主布局

上面根組件(暫且這么叫)MyApp 中醒颖,home 的值 MyHomePage 即為計時器的主頁面妻怎,這里我們看一下 MyHomePage 中都有什么吧。

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

  // This widget is the home page of your application. It is stateful, meaning
  // that it has a State object (defined below) that contains fields that affect
  // how it looks.

  // This class is the configuration for the state. It holds the values (in this
  // case the title) provided by the parent (in this case the App widget) and
  // used by the build method of the State. Fields in a Widget subclass are
  // always marked "final".

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
  //創(chuàng)建 _MyHomePageState()
}

這里主要是 StatefulWidget 組件的使用泞歉,這個放在后面和上邊的 StatelessWidget 一起講逼侦,這里只需要知道創(chuàng)建了 _MyHomePageState() 即可。

  1. State
class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  // 創(chuàng)建 int 型變量 _counter腰耙,默認(rèn)值為 0

  void _incrementCounter() { //定義方法 _incrementCounter()
    setState(() { 
    // RN 中也有 setState 方法榛丢,
    // 這個方法的作用是,在這里面對前邊定義的變量(如 _counter)改變值挺庞,
    // 之后使用這個變量(如 '$_counter',)的地方的值會立刻變化晰赞,不需要再獲取到控件設(shè)置新值,
    // 這就是響應(yīng)式編程。
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) { // 組件的方法掖鱼,在這里返回的即為 _MyHomePageState 組件的布局然走。
    return Scaffold( // Scaffold 實現(xiàn)了 Material Design 的基本布局結(jié)構(gòu),例如 AppBar戏挡、Drawer芍瑞、SnackBar 等,它經(jīng)常會作為 MaterialApp 的子Widget增拥,Scaffold 會自動填充可用的空間啄巧,這通常意味著它將占據(jù)整個窗口或屏幕,并且 Scaffold 會自動適配不同的屏幕掌栅。
      appBar: AppBar( //標(biāo)題 bar
        
        title: Text(widget.title),
      ),
      body: Center( // 頁面內(nèi)容
       
        child: Column( //布局方式秩仆,垂直線性排列
         
          mainAxisAlignment: MainAxisAlignment.center, // 對齊方式:居中對齊
          children: <Widget>[ // children:子組件數(shù)組,可以看到猾封,下面往這個數(shù)組中放置了兩個 Text()澄耍。
            Text( // 這里就是頁面中看到的 “You have pushed the button this many times:” 文字的組件。
              'You have pushed the button this many times:',
            ),
            Text( //點擊后更改的數(shù)字值就是這個 Text
              '$_counter', // _counter 是前邊定義的變量晌缘,這是引用的方法齐莲。
              style: Theme.of(context).textTheme.headline4, // 樣式
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton( // 頁面中右下角圓形懸浮按鈕 FAB。
        onPressed: _incrementCounter,
        // onPressed 點擊事件:調(diào)用了上邊定義的 _incrementCounter()方法磷箕,
        //在這個方法中實現(xiàn)了 _counter++选酗,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), 
    );
  }
}

這里便是實現(xiàn)計時器最關(guān)鍵的部分。各個部分的說明也寫在了上面的注釋中岳枷。

結(jié)束

由此可以看到 Flutter 的頁面是由一個個的組件嵌套而成芒填,不少人會害怕嵌套地獄,其實根本沒啥事空繁,你看這個 Demo 中的包含關(guān)系不就是:

  MyApp ? MyHomePage(_MyHomePageState) ? Scaffold ? AppBar & Center & FloatingActionButton
  Center ? Column ? Text & Text ?

但是可以封裝出來殿衰,用自定義組件繼承,這樣代碼中就不會出現(xiàn)嵌套地獄盛泡,而且新的組件可以新建文件來寫闷祥,只要注意導(dǎo)包(路徑),整體代碼可讀性很高傲诵,而且可以封裝的很簡潔凯砍,反而脈絡(luò)更加清晰。


歡迎大家留言或者發(fā)郵件給我:
郵箱:ymwmlxl@gmail.com


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掰吕,一起剝皮案震驚了整個濱河市果覆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌殖熟,老刑警劉巖局待,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡钳榨,警方通過查閱死者的電腦和手機舰罚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來薛耻,“玉大人营罢,你說我怎么就攤上這事”荩” “怎么了饲漾?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長缕溉。 經(jīng)常有香客問我考传,道長,這世上最難降的妖魔是什么证鸥? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任僚楞,我火速辦了婚禮,結(jié)果婚禮上枉层,老公的妹妹穿的比我還像新娘泉褐。我一直安慰自己,他們只是感情好鸟蜡,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布膜赃。 她就那樣靜靜地躺著,像睡著了一般揉忘。 火紅的嫁衣襯著肌膚如雪财剖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天癌淮,我揣著相機與錄音,去河邊找鬼沦补。 笑死乳蓄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夕膀。 我是一名探鬼主播虚倒,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼产舞!你這毒婦竟也來了魂奥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤易猫,失蹤者是張志新(化名)和其女友劉穎耻煤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡哈蝇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年棺妓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炮赦。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡怜跑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吠勘,到底是詐尸還是另有隱情性芬,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布剧防,位于F島的核電站植锉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏诵姜。R本人自食惡果不足惜汽煮,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棚唆。 院中可真熱鬧暇赤,春花似錦、人聲如沸宵凌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞎惫。三九已至溜腐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瓜喇,已是汗流浹背挺益。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乘寒,地道東北人望众。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像伞辛,于是被迫代替她去往敵國和親烂翰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345