Android Navigation Component — Part.2
เนื้อหา part นี้จะพาทุกคนไปทำความรู้จักกับ Safe Args กันค่ะ
Safe Args
คือ plugin เพื่อ navigate และส่ง data ไปยัง destination อื่นๆ มีการ generate direction class เช่น MainFragmentDirections class และ generate data class สำหรับ Bundle เช่น MainFragmentArgs
เปรียบเทียบ Before vs After
Before (ไม่ใช้ Safe Args)
findNavController().navigate(
R.id.action_mainFragment_to_aboutFragment
)
After (ใช้ Safe Args)
findNavController().navigate(
MainFragmentDirections.actionMainFragmentToAboutFragment()
)
แล้ว Safe อย่างไร
จากเดิมใช้ bundle ส่งข้อมูลระหว่าง fragment หรือ activity ฝั่งปลายทางจะต้องกำหนด key และ type ของข้อมูลให้ตรงกัน ถึงจะได้ข้อมูลมาใช้งาน แต่ Safe Args ทำให้ชีวิตง่ายขึ้น เพราะ direction class รับ bundle และ properties ที่แมตช์กับ argument ใน xml ทำให้ type ข้อมูลถูกต้องเสมอ
เริ่ม Setup
ใน build.gradle(app) เพิ่ม apply plugin ดังนี้
- สำหรับ Module ที่มี Java กับ Kotlin ปนกัน
apply plugin: "androidx.navigation.safeargs"
- สำหรับ Kotlin Module ล้วนๆ
apply plugin: "androidx.navigation.safeargs.kotlin"
ใน build.gradle(project) เพิ่ม classpath ดังนี้
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.2.1"
การส่ง Data ไปยัง Destination
ทำได้โดยกำหนด argument ที่ navigation graph ใน fragment ปลายทางที่รับข้อมูล ตามนี้
<fragment
android:id="@+id/accountFragment"
android:name="com.truedigital.navigation.me.AccountFragment">
<argument
android:name="message"
android:defaultValue="Hello"
app:argType="string"
app:nullable="true" /> <argument
android:name="number"
app:argType="integer"
app:nullable="false" /> <argument
android:name="account_id"
android:defaultValue="1"
app:argType="string" /> <action... />
</fragment>
- 1 <argument…/> คือ 1 parameter
- android:name กำหนดชื่อ parameter
- app:argType กำหนด type of parameter เช่น string, integer, boolean, parcelable, serializable, enum, resource reference
- android:defaultValue(optional) กำหนดค่า default
- app:nullable(optional) กำหนดว่าเป็น nullable หรือไม่
อย่าลืม!! Rebuild ก่อนใช้งาน เพราะ diraction class ยังไม่ถูกสร้างเลย
ตัวอย่างการส่ง Data
findNavController().navigate(
MeFragmentDirections.actionMeFragmentToAccountFragment(
message = "Account Page",
number = 10,
accountId = "2"
)
)
ตัวอย่างการรับ Data
arguments?.let { arguments ->
val args = AccountFragmentArgs.fromBundle(arguments)
val message = args.message
val number = args.number
val id = args.accountId
ตัวอย่าง Parcelable
- set argument ใน navigation graph
<argument
android:name="inboxModel"
android:defaultValue="@null"
app:argType="com.package.InboxModel"
app:nullable="true" />
- การส่ง Data
findNavController().navigate(
MeFragmentDirections.actionMeFragmentToInboxFragment(
inboxModel = InboxModel().apply {
id = "123"
title = "inbox 1"
description = "inbox description"
}
)
)
- การรับ Data
arguments?.let { arguments ->
val args = InboxFragmentArgs.fromBundle(arguments)
val model = args.inboxModel
}