開始寫第一個 Flutter 2 程式
喜歡作者的文章嗎?馬上按「關注」,當作者發佈新文章時,思書™就會 email 通知您。
思書是公開的寫作平台,創新的多筆名寫作方式,能用不同的筆名探索不同的寫作內容,無限寫作創意,如果您喜歡寫作分享,一定要來試試! 《 加入思書》
思書™是自由寫作平台,本文為作者之個人意見。
給本文個喜歡
或不
關於作者
很久以前就是個「寫程式的」,其實,什麼程式都不熟⋯⋯
就,這會一點點,那會一點點⋯⋯
看看作者的其他文章
看看思書的其他文章
如果你照著我之前寫的安裝程式,你的 Android Studio 跟 Flutter 2 SDK 應該都已經裝好了,所以我們現在就可以開始寫 Flutter 了。
寫程式前有一個很重要的建議,就是剛開始學習時,當然可以照著書寫,但是要真學會,看完後就一定要自己找一個目標,自己重新重頭開始寫一次,沒有自己重頭開發的程式,你永遠不算學會。
好啦,來開始寫 Flutter 的第一步,就是先把 flutter22 中,我們之前建立的測試 project 刪掉,我們不會再用到它了。
起步走!
我們現在來寫一個錄音程式,就叫 happy recorder 好了。
打開 Android Studio,創立一個新 happy recorder 專案:
鐺鐺,Main.dart 就打開來等著你修改了!
注意:一定要輸入 Organization
除非你確定這個 App 絕對不會上傳到 App Store,不然就請務必一定要輸入 Organization,它的標準寫法是貴公司的網域倒著寫,例如 google.com 就是 com.google,這個以後非常難改,要改可能會花一兩天的時間(血淚紀錄)。
先來看看會不會動:
第一次要等很長一下,你應該就會看到那個熟悉的 App 出現了!(又是點<+>加一...... )
在 Mac 上我是建議使用 iOS 模擬器,你可能需要先把它打開,Android Studio 才看得到,你也才可以選為目標模擬平台,它比 Andorid 模擬器快多了;如果你一定要用 Andorid 模擬器,但是又沒有看到,你在綠色 Play 鍵旁右右邊,不在上圖裡,可以找 AVD manager,在那裡可以打開 Andorid 模擬器,Andorid 模擬器很慢,要快一點可以選舊的(很舊的)版本。
有 Unable locate adb 警告?
開啟 Android 的模擬器時如果你跟我一樣出現了上面的「警告」,怎麼辦?類似這種問題在開發的過程中,會不斷地出現,所以一定要學會應對,也要習慣怎麼自己找答案,通常 google 就能找到很不錯的答案,但是要能把問題「縮小」,例如像這樣的問題,可以查“flutter Unable locate adb”,如果少了前面的 Flutter,你就把問題被大了。 可能解答1,可能解答2
只是,有一個更重要的問題要問自己,值得花這個時間嗎?我花了五個小時,嘗試解決這個開發平台的問題,還是沒解決,值得嗎?我們是要學寫程式呢?還是要「玩」平台?這種問題很可能在下一次改版後就不存在了。
很好,接下來,找到這行程式,這行其實就是標題,把它改成如下:
按一下綠色 Play 鍵邊的「閃電」,哇,馬上就可以看到標題改了,這就是 flutter 的 hot reload,對程式開發來說,很重要。
需求式學習法 - 先學要必須要懂的
我一直認為學「好」程式語言,甚至是任何事,都是來自真正的需求,如果不是真的需要,就算花了大把的時間精力,到後來還是很快就忘了,這樣的學習效率太低。
這本書就是以需求式學習法寫的,這本書不會讓你精通 Flutter,但是希望能讓你最快會用 Flutter。
很好,我們有一個會動的程式了,那我們就先來看看這個程式的第一段在寫什麼!
package:flutter/material.dart
,我們使用import
這個指令把套件導入。套件是所有開發平台中很重要的資源軍火庫,強大又完整的套件庫可以大幅的提高開發效能,簡單來說,就是不用再重新發明輪子了,但是,如何找到功能強大又維護好的套件就是挑戰了,萬一你用了一個不再維護的套件,作業環境一改(如:OS 更新),可能就不能用了。Flutter 有兩種套件:main()
,有人叫它入口函數,當 App 執行後,系統就會呼叫這個main()
來開始執行,為什麼會叫 main?應該就是從古老的 C 語言留下來的習慣。在 dart 中,使用任何的變數都要先告訴 dart 它是什麼,也就是必須要宣告,函數也是變數,所以我們必須要告訴 dart,這個 main() 是個 void,void = 空靈,就是「無」啦,這也是有效的宣告,有趣吧,寫 void 也就是要 dart 不用管我是什麼啦,不重要,這也是從古老的 C 語言留下來的寫法。void main() => runApp(MyApp());
這個=>
是 dark 的一種簡寫,話說,也不過就是將 {} 改成 =>,字數一樣,有差嗎。接下來看第二段:
Colors.blue
,可調整的地方很多,可以點選文件看一下。Stateless「無狀態」/ Stateful「有狀態」widget 簡介
看完了以上的介紹,下面這兩個影片可以讓你進一步了解 stateless/stateful widget,還有更重要的,了解 Widget tree vs Element Tree,原來螢幕上看到的是 elements,Widget 是個藍圖。
How to Create Stateless Widgets - Flutter Widgets 101 Ep. 1 Google Developers — YouTube
How Stateful Widgets Are Used Best - Flutter Widgets 101 Ep. 2 Google Developers — YouTube
再來看第三段:
(參數):...
是什麼?大括弧 {} 怎麼不見了呢?(參數):...
又是 Flutter 的特殊寫法,放在(參數):後的是個 initializer(起始器),當這函數被呼叫時,會先執行這段,用來做預設起始動作。什麼是 keys?
Key 這個觀念在 Flutter 中很重要,也超難懂,是控制 widget 很重要的觀念,我強烈建議好好的多看幾遍下面的影片,應該是目前最好也最清楚的介紹了,就算看不懂,也可以先有個觀念,知道 Widget 與 elemenet 的關係。
When to Use Keys - Flutter Widgets 101 Ep. 4 Google Developers — YouTube
再來看最後這 State 段:
var
names =<String>
['Seth', 'Kathy', 'Lars'] 這行中,就是指 name 這個 array 內容都是 string,這樣就可以很輕易的建立一個 array 還規定它的內容一定要是 string,換成 <Int>[],就變成 int 內容的 array,所以有 generic 的「通用」寫法是不是很方便。來玩一玩 scaffold()
好啦,你已經看完了整個 Flutter 自動產生的程式了,我相信,基本上頭都昏了,還一行程式都沒寫到,別急,那我們就先來改變一下 Scaffold() 的設定,讓我們往 happy recorder 邁進。
這是改過的程式,我只改了 _MyHomePageState 中的程式碼:
這些改變讓畫面變成了下面這樣:
讓我們來看一下改了什麼:
好啦,我就先改到這裡,大家可以繼續看文件改下去,很好玩的,雖然我們的程式離能夠錄音還很遠,不過,這就是我們的主畫面了。
現在,強烈的建議到下列的網頁看看,可以瞬間增加很多功力:
最後,在結束這篇已經超長的文章前,我還想建議大家看一下這段影片:
當你的 Widget 有很多層時:
請用 InheritedWidget
Inherited Widgets Explained - Flutter Widgets 101 Ep. 3 Google Developers — YouTube
這個影片對初學者來說,太難了,另外也講的很不清楚,我們在目前只要知道,透過這個 Inherited widget 就能讓資料在不同的 Widget 中分享,目前知道這點就夠了。
恭喜你,你已經學會「一些」 Flutter 了。