我的第一個(gè) Flutter 應(yīng)用之旅

參考官網(wǎng)的的開始使用,配置好開發(fā)環(huán)境即可進(jìn)行 Flutter 開發(fā)了蔬蕊,當(dāng)然開發(fā)前還是有必要了解一下 Dart 這門語言的,接下來涉及到與其他開發(fā)語言不太相同的地方會(huì)在文章里提出來。本教程使用的 flutter 版本為穩(wěn)定版本 v2.0.6逻锐。

創(chuàng)建Flutter 工程

推薦使用命令行的方式新建工程(使用 IDE 創(chuàng)建的過程會(huì)比較慢),命令如下:

flutter create hello_world

Flutter 會(huì)默認(rèn)創(chuàng)建一個(gè)示例工程雕薪,然后使用命令 打開工程(code 命令是 vscode 的一個(gè)別名昧诱,需要在.zshrc配置別名:alias code='/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code'

code hello_word

項(xiàng)目目錄結(jié)構(gòu)如下圖所示:


image.png

各個(gè)目錄或文件說明如下:

  • android:安卓原生工程配置相關(guān)文件,包括應(yīng)用圖標(biāo)所袁,原生資源盏档,權(quán)限配置等,可以參考之前的關(guān)于安卓打包發(fā)布的文章:Flutter 如何發(fā)布安卓應(yīng)用燥爷?
  • ios:iOS 原生工程配置相關(guān)文件蜈亩,熟悉 iOS 開發(fā)的會(huì)知道具體的用途,其中 最主要的是 Runner 下前翎,設(shè)置到原生的配置稚配,如最關(guān)鍵的 InfoPlist 文件,以及權(quán)限相關(guān)的配置鱼填,這些配置建議在 Xcode 中配置會(huì)更為直觀药有。
  • build:打包輸出文件,主要是安卓打包文件苹丸,iOS 打包需要通過 Xcode 完成愤惰。
  • lib:最重要的目錄,所有源碼都在這個(gè)目錄赘理,其中 main.dart 是入口文件宦言,而 main 方法是入口方法。
  • test:測試相關(guān)文件
  • web:Flutter 2.0引入的商模,支持三端統(tǒng)一的 web 端文件
  • pubspec.yaml:這個(gè)文件十分重要奠旺,所有的第三方依賴,以及文件依賴都通過這個(gè)文件管理施流,類似與蘋果的 podfile 和安卓的 gradle 文件响疚。

運(yùn)行應(yīng)用

如果要在安卓模擬器運(yùn)行,則需要安裝安卓 Studio瞪醋,并配置好模擬器忿晕,至于安卓真機(jī)調(diào)試與安卓應(yīng)用開發(fā)類似。蘋果也一樣银受,需要安裝 Xcode并啟動(dòng)模擬器践盼。真機(jī)調(diào)試蘋果相對比較麻煩鸦采,需要有開發(fā)者賬號(hào),將真機(jī)的 identifier(設(shè)備唯一標(biāo)識(shí)符)加入到對應(yīng)應(yīng)用的開發(fā)設(shè)備中咕幻,這個(gè)可以自行百度搜索如何配置渔伯。

完成配置后,選擇要運(yùn)行的設(shè)備或模擬器(右下角會(huì)顯示當(dāng)前選定的設(shè)備肄程,如果沒選則是 No Device锣吼,如下圖),命令行運(yùn)行 flutter run皆可完成編譯和進(jìn)入代碼調(diào)試。

image.png

Flutter 應(yīng)用在調(diào)試過程中是支持熱重載的(pub依賴改變了需要重新編譯)绷耍,因此盡量使用熱重載吐限,畢竟編譯一次時(shí)間停長的鲜侥。

開發(fā)設(shè)備配置

如果是要運(yùn)行模擬器褂始,對開發(fā)的設(shè)備要求還是挺高的,推薦使用 Mac Pro(16GB 內(nèi)存)進(jìn)行開發(fā)描函。Windows 電腦的話至少也需要16GB 內(nèi)存崎苗,模擬器一旦運(yùn)行起來那“呼呼”的風(fēng)扇聲讓人聽了感覺電腦干活挺累的!

來點(diǎn)小修改

運(yùn)行起來 demo 了舀寓,不動(dòng)手改改代碼過過癮都沒什么太大感覺胆数,我們來實(shí)現(xiàn)在屏幕中間顯示 Logo,點(diǎn)擊后切換圖片的簡單修改互墓。

使用圖片資源需要兩個(gè)步驟必尼,第一建立一個(gè)圖片文件夾存放圖片資源,第二是需要在 pubspec文件中指定依賴的資源目錄篡撵。新建一個(gè) images 文件夾存放圖片文件判莉,將圖片文件(avatar.jpg 和qrcode.jpg)放到images 目錄下。在 pubspec.yaml 文件中設(shè)置 assets 屬性:

    flutter:

        uses-material-design: true
        assets:
        - images/avatar.jpg
        - images/qrcode.jpg
    
    # 其他配置

注意放置的位置不要弄錯(cuò)了育谬,在 pubspec.yaml 中有相應(yīng)的注釋券盅。配置完成后需要運(yùn)行 flutter pub get命令更新一下依賴的資源。

主要代碼如下所示:

class _MyHomePageState extends State<MyHomePage> {
  List _imageNames = [
    {'image': 'images/avatar.jpg', 'text': '島上碼農(nóng)'},
    {'image': 'images/qrcode.jpg', 'text': '掃碼關(guān)注'}
  ];
  int _index = 0;

  void _onSiwtch() {
    setState(() {
      _index = (++_index) % _imageNames.length;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Container(
          width: 300,
          height: 300,
          child: Column(
            children: [
              Container(
                width: 128,
                height: 128,
                margin: EdgeInsets.only(top: 10, bottom: 10),
                child: Image.asset(
                  _imageNames[_index]['image'],
                  fit: BoxFit.cover,
                ),
              ),
              Text(
                _imageNames[_index]['text'],
              ),
            ],
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _onSiwtch,
        tooltip: '切換',
        child: Icon(Icons.swap_horizontal_circle_outlined),
      ), 
    );
  }
}

代碼邏輯如下:
_MyHomePageState類是 MyHomePage 的 一個(gè)有狀態(tài)組件膛檀,F(xiàn)lutter 的組件和 React 的類似锰镀,分為無狀態(tài)和有狀態(tài),無狀態(tài)組件無法進(jìn)行數(shù)據(jù)更新咖刃,有狀態(tài)組件有自己的數(shù)據(jù)狀態(tài)泳炉,根據(jù)數(shù)據(jù)狀態(tài)更新界面。

下劃線_代表這個(gè)類嚎杨、方法或成員變量是私有的花鹅,在類的外部無法訪問。在_MyHomePageState 中定義了一個(gè) Map <String, String>類型的數(shù)組(List)_imageNames 以及一個(gè)狀態(tài)變量數(shù)組控制下標(biāo)_index磕潮。當(dāng)切換按鈕點(diǎn)擊時(shí)翠胰,會(huì)在_onSwitch 方法中通過 setState更改狀態(tài)變量_index 的值容贝,從而引起界面的自動(dòng)刷新。

頁面組件的元素和層級(jí)如下:

  • appBar:導(dǎo)航欄
  • body:主界面
    • Center:居中組件
      • Container:頁面元素容器之景,類似 html 的 div斤富,通過這個(gè) Container 指定界面中的尺寸和邊距
        • Column:縱向布局,即元素按縱向一次排布锻狗。
          • 圖片容器:用于限定圖片的顯示大小满力,邊距等
            • 圖片:使用本地資源展示圖片
          • 文本:顯示圖片底下的文字
  • floatingActionButton:懸浮按鈕

可以看到整個(gè)頁面的層次和 HTML 很像,實(shí)際上 Dart 最開始的設(shè)計(jì)就是想替換 Javascript 的轻纪,而 Flutter 本身很多理念仿照了 React油额。從代碼也可以看到,界面的嵌套層級(jí)很多刻帚,這被很多人吐槽潦嘶,實(shí)際只要我們將組件抽離,就可以有效減少嵌套層級(jí)(界面的寫法也有點(diǎn)類似 JSX崇众,只是Flutter 內(nèi)置了很多布局組件掂僵,簡化了開發(fā))。

最終效果

helloworld.jpg

點(diǎn)擊切換按鈕圖片和文字會(huì)隨之變化

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末顷歌,一起剝皮案震驚了整個(gè)濱河市锰蓬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌眯漩,老刑警劉巖芹扭,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赦抖,居然都是意外死亡舱卡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門摹芙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灼狰,“玉大人,你說我怎么就攤上這事浮禾〗慌撸” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵盈电,是天一觀的道長蝴簇。 經(jīng)常有香客問我,道長匆帚,這世上最難降的妖魔是什么熬词? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上互拾,老公的妹妹穿的比我還像新娘歪今。我一直安慰自己,他們只是感情好颜矿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布寄猩。 她就那樣靜靜地躺著,像睡著了一般骑疆。 火紅的嫁衣襯著肌膚如雪田篇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天箍铭,我揣著相機(jī)與錄音泊柬,去河邊找鬼。 笑死诈火,一個(gè)胖子當(dāng)著我的面吹牛兽赁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柄瑰,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼闸氮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了教沾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤译断,失蹤者是張志新(化名)和其女友劉穎授翻,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孙咪,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堪唐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翎蹈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淮菠。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖荤堪,靈堂內(nèi)的尸體忽然破棺而出合陵,到底是詐尸還是另有隱情,我是刑警寧澤澄阳,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布拥知,位于F島的核電站,受9級(jí)特大地震影響碎赢,放射性物質(zhì)發(fā)生泄漏低剔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望襟齿。 院中可真熱鬧姻锁,春花似錦、人聲如沸猜欺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽替梨。三九已至钓试,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間副瀑,已是汗流浹背弓熏。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留糠睡,地道東北人挽鞠。 一個(gè)月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像狈孔,于是被迫代替她去往敵國和親信认。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容