Jetpack 实战Kotlin(三)sunflower 分析K
Jetpack 实战目录:
Jetpack 实战Java(一)写Java版的sunflower 分析Java版本
Jetpack 实战Java(二)写Java版的sunflower 分析Java版本
回顾Java 版本
Navigation & Navigation UI
Nagvigation 三要素:
① Navigation Graph
② Navigation Controller
③ Navigation HostFragment
项目整体结构:
DataBinding+DrawLayout+NavHostFragment+NavigationView
Kotlin Sunflower 结构
项目整体结构:
DataBinding+NavHostFragment+NavigationView
Navigation Graph的布局文件,大体相似
navigation->fragment 并列通过Navigation Controller 通过NavHostFragment展示(包含 action argument等)
nav_garden.xml
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
app:startDestination="@id/view_pager_fragment">
<fragment
android:id="@+id/view_pager_fragment"
android:name="com.google.samples.apps.sunflower.HomeViewPagerFragment"
tools:layout="@layout/fragment_view_pager">
<action
android:id="@+id/action_view_pager_fragment_to_plant_detail_fragment"
app:destination="@id/plant_detail_fragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />
</fragment>
<fragment
android:id="@+id/plant_detail_fragment"
android:name="com.google.samples.apps.sunflower.PlantDetailFragment"
android:label="@string/plant_details_title"
tools:layout="@layout/fragment_plant_detail">
<action
android:id="@+id/action_plant_detail_fragment_to_gallery_fragment"
app:destination="@id/gallery_fragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />
<argument
android:name="plantId"
app:argType="string" />
</fragment>
<fragment
android:id="@+id/gallery_fragment"
android:name="com.google.samples.apps.sunflower.GalleryFragment"
android:label="@string/plant_details_title"
tools:layout="@layout/fragment_gallery">
<argument
android:name="plantName"
app:argType="string" />
</fragment>
</navigation>
2021-04-05 11.26.56.png
首页的HomeViewPagerFragment 维护ViewPager2 包含两个界面
① GardenFragment->fragment_graden.xml
② PlantListFragment-> fragment_plant_list.xml
业务逻辑简单:GardenFragment 花园,在PlantListFragment植物列表选取一个植物,添加到个人的花园,两个页面都是列表的形态展示。右上角有排序小功能
GardenFragment | PlantListFragment |
---|---|
2021-04-05 11.40.09.png | 截屏2021-04-05 11.40.22.png |
两个版本UI稍微不同,核心用到的知识点,和逻辑是一样的。
都是两个列表,在一个总的列表选择自己喜欢的植物,加入到个人的花园列表,和很多应用逻辑,变换一下思路,是一样的。
点击列表页都是进入详情。相应的有一些数据和展示。
技术点
还是遵循这个架构图
2021-01-28 21.38.17.png
由简单到深入:老规矩分两篇,第一篇整体理解,第二篇深入知识点分析。
① Navigation 技术,Java 两篇技术已经基本阐述清楚
② ktx 协程处理相关,下一篇整理分析
③ ViewPager2 使用
④ gson配合解析数据
⑤ 基本使用viewmodel,livedata等基础套件
⑥ jetpack paging 分页库
⑦ jetpack room 存储库,CoroutineWorker 配合
⑧ 单元测试espresso ,junit
⑨ jetpack DI 框架Hilt + Dagger2
这个官网练手项目,对整个架构,用比较老的一句话形容“麻雀虽小,五脏俱全”下篇,继续分享。
从gradle几个关键配置,回顾jetpack的使用配置
关于lib库,和常用配置,就不多说了,我们看几个关键特殊相关的配置。
hilt 依赖注入插件配置
app:gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'
apply plugin: 'androidx.navigation.safeargs.kotlin'
android {
...
defaultConfig {
...
testInstrumentationRunner "com.google.samples.apps.sunflower.utilities.MainTestRunner"
...
vectorDrawables.useSupportLibrary true
// Consult the README on instructions for setting up Unsplash API key
buildConfigField("String", "UNSPLASH_ACCESS_KEY", "\"" + getUnsplashAccess() + "\"")
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"] = "true"
}
}
}
buildTypes {
release {
...
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
// work-runtime-ktx 2.1.0 and above now requires Java 8
jvmTarget = "1.8"
// Enable Coroutines and Flow APIs
freeCompilerArgs += "-Xopt-in=kotlinx.coroutines.ExperimentalCoroutinesApi"
freeCompilerArgs += "-Xopt-in=kotlinx.coroutines.FlowPreview"
}
}
① hilt 的配置和Navigation传递参数的插件配置:
注意gradle中插件声明中,最后两行,一个是hilt的plugin,还有一个和Navigation 传值的插件。整体顺序前三行,注意不要改变。
这还不够。
在project:gradle,还需要配置hilt的依赖和对应Navigationsafe-args的插件配置(最后两行)
dependencies {
classpath "com.android.tools.build:gradle:$gradleVersion"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$navigationVersion"
classpath "com.google.dagger:hilt-android-gradle-plugin:$hiltVersion"
}
② 由于项目用到unsplash 的api,所以需要到上面获取api key ,如何获取,搜索引擎自己查找。
在gradle.properties 配置key
buildConfigField-----getUnsplashAccess 方法中动态获取
③ annotationProcessorOptions 配置apt kotlin check 开关
支持kt 协程的Flow api