對sunflower的整體分析
- 前言
- 專案的整體流程
- 從資料庫層面進行分析
- 從執行流程進行分析
前言
sunflower是運用了Jetpack組件,而開發出的一個app,語言采用的是kotlin,本文要求大家應該對Jetpack組件,及kotlin語法有一定的了解,Android Jetpack組件推薦的使用專案架構:
注意所有的參考都是單向的,尤其注意viewModel會持有repository的參考, 而對資料的操作(通過Dao的增刪查改)和網路請求都是在repository中完成的

sunflower專案的地址為:https://github.com/android/sunflower
專案的整體流程
該專案界面主要分為三個部分:
- gardenPlanting部分 -> 我的花園界面
- plantList部分 -> 植物串列的界面
- plantDetail部分 -> 植物的詳情界面
注意:沒有考慮gallery部分,因為gallery部分還需要申請API的密鑰,
從資料庫層面進行分析
分為garden_plantings和plants兩個資料表
有兩個data物體類,GardenPlanting和Plant
Plant資料類對應plants表,GardenPlanting資料類對應garden_plants表
plants表:存盤了所有植物的資訊
這里資料的獲取并不是來源于網路,而是來自于事先已經創建好了的assets目錄下的json陣列,并在資料庫創建時,通過WorkManger發送這個請求,把所有Plant的資訊insert到plants表中,



garden_plantings表:記錄了plant的名字,種下日期,最后澆水的時間,
當你選擇你要添加的植物(在植物的detail界面),就會根據plantId屬性insert到garden_plantings表中,


此外,還有一個資料類PlantAndGardenPlantings
表示兩個表之間的映射關系,一個Plant,對應多個GardenPlanting,兩個表通過Plant的id與GardenPlanting的plant_id來聯系,通過observe方法,我的花園界面就會同步重繪,
為什么存在這個表,因為在我的花園界面,不僅要顯示plants表中的資訊,還要顯示garden_plants表的資訊,


小結:
我的花園界面即GardenFragment對應的倉庫是GardenPlantingRepository,倉庫中的Dao是gardenPlantingDao,填充界面資料的物體類是PlantAndGardenPlantings而不是GardenPlanting
植物串列即PlantListFragment對應的倉庫是PlantRepository,Dao層是PlantDao,填充界面資料所用到的類是Plant類
植物的詳情界面即PlantDetailFragment對應的倉庫有PlantRepository和GardenPlantingRepository,前者用于填充界面資料,后者則用于記錄植物的添加及洗掉操作
從執行流程進行分析

- 找到程式的入口
<activity
android:name=".GardenActivity"
android:theme="@style/Theme.Sunflower.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- 進入到我的花園界面
如果運行了sunflower這個專案,app一打開就會進入到這個界面,那么它是怎么實作的呢?

此處會用到Navigation組件,GardenActivity對應的xml中有一個控制元件,它有一個屬性app:navGraph,app:navGraph: 屬性賦值的是 nagation檔案(類似是一個的導航圖),用來管理fragment及跳轉

<fragment
android:id="@+id/nav_host"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_garden"/>
nav_garden的可視化界面如下
注意箭頭(action)代表的就是跳轉方向,可能還會攜帶引數傳遞
,這個可以用插件實作,
比如說:跳轉到plant的詳情界面,肯定會需要plantId屬性(來源于plants表),因為必須要知道是哪個plant的detail界面打開了,

所以此時就來到了與view_pager_fragment所對應的HomeViewPagerFragment,它大體采用的就是tablayout + viewpager2,有兩個頁面,GardenFragment和PlantListFragment,默認選中的就是GardenFragment頁面,即我的花園界面
- fragment之間的跳轉
第一次啟動這個app,GardenFragment界面沒有plant,點擊add plant按鈕,就會跳轉到PlantListFragment
private fun navigateToPlantListPage() {
requireActivity().findViewById<ViewPager2>(R.id.view_pager).currentItem =
PLANT_LIST_PAGE_INDEX
}

在PlantListFragment界面點擊某植物會進入PlantDetailFragment,如果某植物已經添加到我的花園中,就不會顯示添加植物的button



相同地,在GardenFragment也能跳轉到PlantDetailFragment
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/189889.html
標籤:其他
