close

上回提到了 Navigation 這個好用的元件

點我看上回  Android Kotlin/Java Jetpack Navigation 介紹、入門教學 example、sample code 實作範例』Willy's Fish教學筆記

 

這次要來說它的好搭擋 Safe Args

Safe Args 主要的功能是幫助我們做 Arguments 的傳遞

優點是它是型別安全的

而且藉由自動生成的 getter / setter 

可以更直覺化的使用物件

 

那麼 Safe Args 倒底生成了什麼類呢?

以 google 官方 sunflower 來舉例

這兩個都是 Safe Args 依據我們的 navigation 來生成的

navigation.xml 如下

<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"/>
</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">
    <argument
        android:name="plantId"
        app:argType="string" />
</fragment>

 

從這段 xml code 我們可以看到

HomeViewPagerFragmentDirections 是由 Class Name + Directions 組成

裡面會有個 Method 是由 Action Id 生成的

companion object {
    fun actionViewPagerFragmentToPlantDetailFragment
        (plantId: String): NavDirections =
            ActionViewPagerFragmentToPlantDetailFragment(plantId)
}

 

PlantDetailFragmentArgs 則是由 Class Name + Args 組成

由於我們在 PlantDetailFragment 中有定義 <argument>

因此會協助我們生成此 Class 

那麼 <argument> 可以包什麼類型的數值呢?

其實和 Bundle 一樣

這有一張表可以看到類型 & 支援 default value & nullable

點我看圖片來源

 

知道了怎麼定義 xml 與其生成的 Class 之後

我們就可以來試著用用看囉

先首要在 project/build.gradle 加入

ext{
    nav_version = "2.1.0"
}
repositories {
    google()    
}
dependencies {
classpath 
"androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
}

然後再 app/build.gradle 的頂部加入

Java:

apply plugin: "androidx.navigation.safeargs"

 

Kotlin:

apply plugin: "androidx.navigation.safeargs"

 

在 sync gradle 之後

只要剛剛的 xml 有設定完成,我們就可以開始用了

 

轉頁如下:

private fun navigateToPlant(plantId: String, view: View) {
    val direction = HomeViewPagerFragmentDirections
        .actionViewPagerFragmentToPlantDetailFragment(plantId)
    view.findNavController().navigate(direction)
}

 

收參數如下:

val args: PlantDetailFragmentArgs by navArgs()
val plantId = args.plantId

 

這樣就可以了,我們來看看以前的寫法

val plantId = arguments?.getString("plantId") ?: ""

新寫法以後不用再多打一個 ? 了 

直覺的就拿來用即可

下一篇有整個頁面跳轉流程的控制介紹

點我看下一篇 Android Kotlin/Java Jetpack Navigation (三) Destination Back Stack 退回棧, 怎麼一次退回、返回多頁,How to back to multiple pages with the system back button?』Willy's Fish教學筆記

 

 

 

資料來源:

https://developer.android.com/guide/navigation/navigation-getting-started#kotlin

https://developer.android.com/guide/navigation/navigation-pass-data#supported_argument_types

 

 

arrow
arrow

    顏澤偉 發表在 痞客邦 留言(0) 人氣()