專案起因
本人租房在融澤嘉園,每天去上地上班,日常交通路線是乘坐963到軟體園廣場,再轉447/446/982/365到上地七街,但有好幾次等963公交就等了30到40分鐘(西二旗太堵了),之後我通過“北京公交”微信公眾號來檢視963到站資訊再出門,這樣就只需計算好時間出門,每次都能恰好趕上。
然而,恕我直言,通過微信公眾號查詢的步驟太繁瑣了:
開啟微信 ->搜尋北京公眾號-> 點選實時查詢公交選單 -> 選擇公交路線-> 選擇方向 ->選擇當前站點 -> 查詢
操作貌似不是很複雜呀,額,我有個偏執的觀點,玩遊戲選區時,我都儘量往靠前的區選,這樣以後領取獎勵的時候不用滑太久,不然->_->
所以,為了化解我心中的偏執,我打算寫一個App,簡化查詢實時公交到站資訊的流程,本來打算用Android寫的,但Google推出的Flutter移動UI框架有一段時間了,作為一個移動開發從業者,不嘗試一下貌似有點不太給面子。膜拜了下Flutter Live裡展示的幾個有意思的demo,就開始學習Dart語法了。
開啟準備
前期工作主要分為兩部分,一是介面資料抓取,分析,處理,二是Flutter環境搭建,學習Dart語法規範,Flutter元件使用。
資料處理
開啟北京公交網,開啟瀏覽器“檢查”,通過操作實時公交查詢,分析發出的請求和請求結果,最後提取出所需要的幾個介面
獲取北京所有公交路線
http://www.bjbus.com/home/index.php
根據所選路線獲取該路線的路線方向
根據所選路線,路線的方向,獲取該路線上的所有站點列表
根據所選路線,路線方向,當前站點獲取該路線上的公交到站資訊
http://www.bjbus.com/home/ajax_rtbus_data.php?act=busTime&selBLine=10&selBDir=5582831127904445311&selBStop=3
接下來就是對上述結果進行html解析,json解析了,具體可檢視專案原始碼。
Flutter學習
入坑開發
Flutter非同步
Dart是一個單執行緒的語言,Dart中實現非同步的方式是:當遇到有需要延遲的運算(async)時,將其放入到延遲運算的訊息佇列(await)中去,把不需要延遲運算的部分先執行掉,最後再來處理延遲運算的部分。
Dart的命令列應用可以通過建立isolates來達到並行執行,但isolates之間不會共享記憶體,它們就像幾個執行在不同程式中的app,通過傳遞message來進行交流。除非明確指出執行在額外的isolates或者workers中的程式碼,所有的應用程式碼都是執行在應用的main isolate中
一個Dart應用開始的標誌是它的main isolate執行了main方法。當main方法退出後,main isolate的執行緒就會去逐一處理訊息佇列中的訊息,訊息佇列有兩種:
- Event佇列
包括I/O,mouse events,drawing events,timers,isolate之間的message等。可以通過new Future
或者new Future.delayed()
來向event佇列中新增事件
- Microtask佇列
只包含來自當前isolate的內部程式碼,用scheduleMicrotask()方法新增
最後程式碼執行順序為,main方法程式碼-> Microtask佇列 ->Event佇列,所有訊息佇列裡的事件執行按照先進先出原則順序,
Flutter控制元件
在Flutter但世界裡,一切都是Weight,,不管是輸入框,圖片,還是佈局容器,甚至居中,內邊距,外邊距,都是Weight,這些Weight相互巢狀構成完整的介面,因此需要運用設計模式編寫優雅的程式碼。Flutter自帶了十分豐富等控制元件,雖然也存在一些不足,但隨著Flutter社群不斷壯大,相信日後必將逐漸完善,本次專案使用了不少元件,如SimpleDialog,ListView,Stepper
Flutter動畫
Flutter動畫在本次專案中主要有三種
- 閃屏介面的應用圖示放大動畫,採用Animation和AnimationController控制
- 頁面切換動畫,通過自定義Route實現
- Flare動畫,參考Flutter動畫之Flare的製作與使用,在2dimensions網站上有許多Demo
啟動頁面和閃屏頁面
App每次剛開始啟動由於應用需要初始化資源,往往有一段白屏,顯示白屏是由於Android預設給啟動時的介面設定了一個白色背景,我們可以通過自己修改配置來改變啟動頁背景。
而閃屏頁面,即在啟動頁之後顯示,之後需要移除任務棧,具體設定方法可以參考下述文章
專案地址
感興趣的道友也可以可以下載專案後本地打包