上回提到了 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") ?: ""
新寫法以後不用再多打一個 ? 了
直覺的就拿來用即可
下一篇有整個頁面跳轉流程的控制介紹
資料來源:
https://developer.android.com/guide/navigation/navigation-getting-started#kotlin
https://developer.android.com/guide/navigation/navigation-pass-data#supported_argument_types
留言列表