AstroPhotons的設計 這是寫給以後的自己看的記錄文。以便日後更新App。 - 程式架構 如網頁標題,這是給Android的App。採用Jetpack Compose的部件(components)來設計介面,循著MVVM (Model-View-ViewModel)的標準,焦點分離(Separation of Concern)的原則來規劃架構。最底層是與介面無關的Repository: Database Repository (Room), Network Repository(Retrofit2), Status of Network Repository (System)。所有的Repository都以資料流(Flow)的方式把資料的更新提交給ViewModel,再由ViewModel更新介面的狀態,確保使用者看到的都是最即時的資訊。 - 資料流 ViewModel初使化時首先判斷資料庫(Room)是否已有資料,如果沒有資料代表App是初次使用,接著到NASA的APOD官網下載列表清單(Retrofit2)加入資料庫。此時資料庫只會有日期與英文標題(因為列表清單只有這些資訊)。一旦資料庫有資料更動,介面就會開始更新。 另一種狀況是,如果ViewModel發現資料庫已經有資料了,也會在背景抓取APOD官網的列表清單準備更新資料。但是在抓取新列表的同時,介面已經可以跟使用者互動了。如果有發現需要更新的資料,也會把新的資料加到資料庫裡頭,同時更新介面。 除了列表清單是一律從NASA APOD英文官網抓取外,Network Repository會根據顯示的語言分別到NASA的官網或成大的中文翻譯網抓取每天的APOD詳細資料。成大的網頁其實也有英文的版本,但是網站不是很穩,所以英文還是以NASA的官網為主。 AstroPhotons除了APOD資料流外,還觀察系統的網路狀態。一旦系統察覺網路斷線了,就會發出網路已經斷線的資料流,此時App就會跳出警示,提醒使用者檢查網路。 語言的選擇以Jetpack DataStore存放。離開App時的所使用的語言就是下次開啟App時的預設語言。Jetpack DataStore存放的內容也是以data flow的方式更新介面。 keywords: Kotlin flow, state flow, coroutine, view...