Android Navigation Component แบบเบื้องต้น (Part 2)
Part นี้จะเป็น Part สั้น ๆ พูดถึงเฉพาะเรื่องการส่งข้อมูลไปยัง Destination โดยใช้ Safe Args นะครับ
ก่อนอื่น ใครอยากกลับไปอ่าน Part แรก จิ้มลิงค์เบา ๆ ได้เลยครับ
เกริ่นสักนิดก่อนว่าปกติแล้วเวลาเราส่งข้อมูลข้าม Activity เรามักจะใช้ Bundle
แต่ปัญหาของมันก็คือ Type ที่ไม่ Safe เพราะเราส่ง Data เข้า Bundle ไปเป็น Key-Value แล้วฝั่งที่จะเรียกใช้ก็ต้องใส่ Key กำหนด Type ให้ตรงกับที่ส่งมา Safe Args จึงจะมาช่วยเราแก้ปัญหานี้
Safe Args
Safe Args เป็น plugin ที่ใช้คู่กับ Navigation Component หน้าที่ของมันคือ generate class Direction แล้วใช้ class นั้นในการเปลี่ยน Destination โดยที่เราสามารถส่งข้อมูลไปกับ Direction ได้ แต่ก่อนที่เราจะมารู้จัก Direction เรามา setup กันก่อนสักเล็กน้อย
Setup
ในการใช้ Safe Args จะต้องเพิ่ม classpath ของ Safe Args เข้าไปใน build.gradle (Project) ก่อน
และใส่ plugin ของ Safe Args ใน build.gradle (Module: app)
apply plugin: "androidx.navigation.safeargs.kotlin"
เท่านี้โปรเจคก็สามารถใช้งาน Safe Args ได้แล้ว
Arguments
เริ่มแรกเราจะต้องกำหนด Argument ให้กับ Destination ที่เราจะ navigate ไปซะก่อน ซึ่งการเพิ่ม Argument เป็นการกำหนดว่าที่ Destination นั้นจะรับ data ประเภทไหนบ้าง ชื่ออะไรบ้าง
โดยคุณผู้อ่านสามารถกด Add Argument ใน editor หรือจะใส่ code เองก็ได้ ตามตัวอย่างด้านล่างครับ
เมื่อเพิ่มแล้วให้สั่ง rebuild สักหนึ่งที เพื่อให้ Gradlegenerate class Direction
Direction
Class Direction ที่ถูก generate ออกมาจะชื่อเหมือน class Destination ของเรา แต่จะมีการเติมคำว่า “Directions” เข้าไป เช่น เรามี class FirstFragment ตัวที่ถูก generate ออกมาจะชื่อว่า FirstFragmentDirections และจะมี static method ที่เป็นชื่อเดียวกับชื่อ action เราติดมาด้วย
จาก Part ที่แล้ว เรา navigate ไปหน้าอื่นโดยใช้ id ของ action แต่คราวนี้เราจะใช้ Direction ที่ generate มาแทน
คุณผู้อ่านจะเห็นว่าเราสามารถส่ง data ไปกับ method ที่เป็นชื่อ action ได้เลย ตัว parameter message กับ number ก็ถูก generate ออกมาเหมือนกัน
ส่วนการรับค่าที่ปลายทางให้เรียก class Args ที่ถูก generate มา ในที่นี้ผม navigate จาก FirstFragment ไป SecondFragment ผมเลยต้องเรียก class SecondFragmentArgs เพื่อรับ data
จบแล้วครับสำหรับ Part นี้ Navigation Component ยังมีความาสามารถอื่น ๆ อีกหลายอย่างให้เราค้นหา เช่น Deeplink, Condition Navigation, Nested Graph, Custom Back Navigation เป็นต้น แต่สำหรับบทความนี้ก็มีเท่านี้ครับ ไว้เจอกันใหม่บทความหน้าครับ :)