Android 知识Kotlin 知识JetpackPack 知识

Jetpack 实战Kotlin(三)sunflower 分析K

2021-04-05  本文已影响0人  zcwfeng

Jetpack 实战目录:

Jetpack 实战Java(一)写Java版的sunflower 分析Java版本

Jetpack 实战Java(二)写Java版的sunflower 分析Java版本

Hilt入门思想,DI框架撇一眼

回顾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

上一篇下一篇

猜你喜欢

热点阅读