หน้านี้เป็นคำแนะนำในการแยกโค้ดการนำทางออกเป็นโมดูล โดยมีวัตถุประสงค์เพื่อ เสริมคำแนะนำทั่วไปสำหรับการแยกส่วนแอป
ภาพรวม
การแยกโค้ดการนำทางออกเป็นโมดูลคือกระบวนการแยกคีย์การนำทางที่เกี่ยวข้องและเนื้อหาที่คีย์เหล่านั้นแสดงออกเป็นโมดูลแต่ละโมดูล ซึ่งจะช่วยให้คุณแยกความรับผิดชอบได้อย่างชัดเจนและไปยังส่วนต่างๆ ในแอปได้
หากต้องการแยกโค้ดการนำทางออกเป็นโมดูล ให้ทำดังนี้
- สร้างโมดูลย่อย 2 โมดูล ได้แก่
apiและimplสำหรับแต่ละฟีเจอร์ในแอป - วางคีย์การนำทางสำหรับแต่ละฟีเจอร์ลงใน
apiโมดูลของฟีเจอร์นั้น - วาง
entryProvidersและเนื้อหาที่ไปยังส่วนต่างๆ ได้สำหรับแต่ละฟีเจอร์ลงในimplโมดูลที่เชื่อมโยง - ระบุ
entryProvidersให้กับโมดูลแอปหลัก ไม่ว่าจะโดยตรงหรือใช้ การแทรกการอ้างอิง
แยกฟีเจอร์ออกเป็นโมดูลย่อยของ API และการติดตั้งใช้งาน
สำหรับฟีเจอร์แต่ละอย่างในแอป ให้สร้างโมดูลย่อย 2 โมดูลชื่อ api และ impl
(ย่อมาจาก "การติดตั้งใช้งาน") ใช้ตารางต่อไปนี้เพื่อตัดสินใจว่าจะวาง
โค้ดการนำทางไว้ที่ใด
ชื่อโมดูล |
มี |
|
|
|
เนื้อหาสำหรับฟีเจอร์ดังกล่าว รวมถึงคำจำกัดความของ
|
วิธีนี้ช่วยให้ฟีเจอร์หนึ่งไปยังอีกฟีเจอร์หนึ่งได้โดยอนุญาตให้เนื้อหาของฟีเจอร์นั้น ซึ่งอยู่ในโมดูล impl ของฟีเจอร์นั้น ขึ้นอยู่กับปุ่มนำทางของโมดูลอื่น ซึ่งอยู่ในโมดูล api ของโมดูลนั้น
แยกรายการการนำทางโดยใช้ฟังก์ชันส่วนขยาย
ใน Navigation 3 ระบบจะกำหนดเนื้อหาที่ไปยังส่วนต่างๆ ได้โดยใช้รายการการนำทาง หากต้องการ
แยกรายการเหล่านี้ออกเป็นโมดูลแยกต่างหาก ให้สร้างฟังก์ชันส่วนขยายใน
EntryProviderScope แล้วย้ายไปยังโมดูล impl สำหรับฟีเจอร์นั้น
ซึ่งเรียกว่าเครื่องมือสร้างรายการ
ตัวอย่างโค้ดต่อไปนี้แสดงเครื่องมือสร้างรายการที่สร้างรายการการนำทาง 2 รายการ
// import androidx.navigation3.runtime.EntryProviderScope // import androidx.navigation3.runtime.NavKey fun EntryProviderScope<NavKey>.featureAEntryBuilder() { entry<KeyA> { ContentRed("Screen A") { // Content for screen A } } entry<KeyA2> { ContentGreen("Screen A2") { // Content for screen A2 } } }
เรียกใช้ฟังก์ชันดังกล่าวโดยใช้ entryProvider DSL เมื่อกำหนด
entryProvider ในโมดูลแอปหลัก
// import androidx.navigation3.runtime.entryProvider // import androidx.navigation3.ui.NavDisplay NavDisplay( entryProvider = entryProvider { featureAEntryBuilder() }, // ... )
ใช้การขึ้นต่อกันเพื่อเพิ่มรายการไปยังแอปหลัก
ในตัวอย่างโค้ดก่อนหน้านี้ แอปหลักจะเรียกใช้เครื่องมือสร้างรายการแต่ละรายการโดยตรง
โดยใช้ entryProvider DSL หากแอปมีหน้าจอหรือโมดูลฟีเจอร์จำนวนมาก
การดำเนินการนี้อาจปรับขนาดได้ไม่ดี
หากต้องการแก้ไขปัญหานี้ ให้โมดูลฟีเจอร์แต่ละโมดูลมีส่วนร่วมในการสร้างรายการของตนเองในกิจกรรมของแอปโดยใช้การแทรกการอ้างอิง
ตัวอย่างเช่น โค้ดต่อไปนี้ใช้ Dagger multibindings
โดยเฉพาะ @IntoSet เพื่อแทรกตัวสร้างรายการลงใน Set ที่เป็นของ
MainActivity จากนั้นจะมีการเรียกใช้ซ้ำๆ ภายใน entryProvider
จึงไม่จำเป็นต้องเรียกฟังก์ชันตัวสร้างรายการหลายรายการอย่างชัดเจน
โมดูลฟีเจอร์
// import dagger.Module // import dagger.Provides // import dagger.hilt.InstallIn // import dagger.hilt.android.components.ActivityRetainedComponent // import dagger.multibindings.IntoSet @Module @InstallIn(ActivityRetainedComponent::class) object FeatureAModule { @IntoSet @Provides fun provideFeatureAEntryBuilder() : EntryProviderScope<NavKey>.() -> Unit = { featureAEntryBuilder() } }
โมดูลแอป
// import android.os.Bundle // import androidx.activity.ComponentActivity // import androidx.activity.compose.setContent // import androidx.navigation3.runtime.EntryProviderScope // import androidx.navigation3.runtime.NavKey // import androidx.navigation3.runtime.entryProvider // import androidx.navigation3.ui.NavDisplay // import javax.inject.Inject class MainActivity : ComponentActivity() { @Inject lateinit var entryBuilders: Set<@JvmSuppressWildcards EntryProviderScope<NavKey>.() -> Unit> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { NavDisplay( entryProvider = entryProvider { entryBuilders.forEach { builder -> this.builder() } }, // ... ) } } }
หากรายการการนำทางต้องนำทาง เช่น มีองค์ประกอบ UI ที่นำทางไปยังหน้าจอใหม่ ให้แทรกออบเจ็กต์ที่สามารถแก้ไขสถานะการนำทางของแอปไปยังฟังก์ชัน Builder แต่ละรายการ
แหล่งข้อมูล
ดูตัวอย่างโค้ดที่แสดงวิธีแยกโค้ด Navigation 3 ออกเป็นโมดูลได้ที่
- สูตรการเขียนโค้ดสถาปัตยกรรม Navigation 3
- เส้นทางการเรียนรู้การแยกส่วนจากแอป Now in Android
- Androidify