抽丝剥茧之探索Jetpack的最佳实践-sunflower



前言

sunflower是运用了Jetpack组件,而开发出的一个app,语言采用的是kotlin。本文要求大家应该对Jetpack组件,及kotlin语法有一定的了解。
Android Jetpack组件推荐的使用项目架构:
 注意所有的引用都是单向的,尤其注意viewModel会持有repository的引用。
 而对数据的操作(通过Dao的增删查改)和网络请求都是在repository中完成的

在这里插入图片描述
sunflower项目的地址为:https://github.com/android/sunflower


项目的整体流程

该项目界面主要分为三个部分:

  1. gardenPlanting部分 -> 我的花园界面
  2. plantList部分 -> 植物列表的界面
  3. plantDetail部分 -> 植物的详情界面

注意:没有考虑gallery部分,因为gallery部分还需要申请API的密钥。

从数据库层面进行分析

分为garden_plantingsplants两个数据表
有两个data实体类,GardenPlantingPlant
Plant数据类对应plants表,GardenPlanting数据类对应garden_plants
plants表:存储了所有植物的信息
这里数据的获取并不是来源于网络,而是来自于事先已经创建好了的assets目录下的json数组,并在数据库创建时,通过WorkManger发送这个请求,把所有Plant的信息insert到plants表中。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述garden_plantings表:记录了plant的名字,种下日期,最后浇水的时间。
当你选择你要添加的植物(在植物的detail界面),就会根据plantId属性insertgarden_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对应的仓库有PlantRepositoryGardenPlantingRepository,前者用于填充界面数据,后者则用于记录植物的添加及删除操作

从执行流程进行分析

在这里插入图片描述

扫描二维码关注公众号,回复: 11974540 查看本文章
  1. 找到程序的入口
        <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>
  1. 进入到我的花园界面
    如果运行了sunflower这个项目,app一打开就会进入到这个界面,那么它是怎么实现的呢?
    在这里插入图片描述
    此处会用到Navigation组件,GardenActivity对应的xml中有一个控件,它有一个属性app:navGraphapp: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,有两个页面,GardenFragmentPlantListFragment,默认选中的就是GardenFragment页面,即我的花园界面

  1. 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


猜你喜欢

转载自blog.csdn.net/zk2000416/article/details/109109922