โยกย้ายจาก Dagger2 ไปยัง Hilt ในโครงการหลายโมดูล
คำแนะนำทีละขั้นตอนในการโยกย้ายจากDagger
ไปยังHilt
ในโครงการหลายโมดูล
โครงสร้างโครงการ
เพื่อให้เห็นภาพโครงการ ประกอบด้วยโมดูลหลายโมดูล NetworkModule, StorageModule, CommonModule, FeatureModule เป็นต้น ในโครงการจริงอาจมีโมดูลมากกว่านี้ แต่เราจำกัดเฉพาะโมดูลต่อไปนี้
กลยุทธ์การย้ายถิ่น
เราต้องการโยกย้ายอย่างสมบูรณ์Dagger
แต่Hilt
ในทางปฏิบัติ เราต้องการวิธีการเพิ่มเติม โดยที่เราจะโอนย้ายapp
โครงการของเราไปHilt
ที่โมดูลอื่นก่อน ซึ่งหมายความว่าDagger
และHilt
ควรทำงานควบคู่กันไปสักระยะหนึ่งจนกว่าการย้ายข้อมูลจะเสร็จสิ้น
รุ่น
เรื่องราว นี้จะทำการโยกย้ายจากDagger 2.24
ถึงHilt 2.45
เนื้อหา
- การกำหนดค่า/การเตรียมการ
- ย้ายข้อมูลส่วนประกอบของแอปและ Singleton
- ย้ายคลาสแอปพลิเคชัน
- ย้ายคลาสกิจกรรม
- โยกย้ายชิ้นส่วน
- โยกย้าย ViewModel
- การล้างข้อมูลหลังการย้ายข้อมูล
- บทสรุปและประเด็นสำคัญ
ในการรวม เพิ่มการอ้างอิงต่อไปนี้ลงใน ไฟล์Hilt
ของแอป Gradlebuild.gradle
กำหนดค่า เพื่อตั้ง ค่าkapt
CorrectErrorType เป็นtrue
ไฟล์build.gradle
dependencies {
implementation 'com.google.dagger:hilt-android:2.45'
kapt 'com.google.dagger:hilt-compiler:2.45'
}
// Allow references to generated code
kapt {
correctErrorTypes = true
}
plugins {
// other plugins
id 'com.google.dagger.hilt.android' version '2.45' apply false
}
plugins {
// other plugins
id 'com.google.dagger.hilt.android'
}
android {
....
}
ย้ายส่วนประกอบแอป
Dagger มีSingleton
Component
โมดูล Dagger ทั้งหมดที่สร้างขึ้นในแอปหรือโมดูลอื่นๆ ของโครงการ และโดยปกติจะทำในAppComponent
คลาสที่สร้างขึ้นDagger
สำหรับ
ลองดูที่ไฟล์AppComponent.kt ปัจจุบัน
ในการโอนย้ายSingleton
Component
เราจำเป็นต้องติดตั้งแต่ละโมดูล เช่นNetworkModule , StorageModuleฯลฯ ลงในSingletonComponent
for Hilt
คุณสามารถทำได้โดยใส่คำอธิบายประกอบโมดูลแต่ละโมดูลด้วย@InstallIn(SingletonComponent::class)
แต่ถ้าคุณมีโมดูลจำนวนมาก การเปลี่ยนโมดูลทั้งหมดในคราวเดียวอาจไม่ใช่ความคิดที่ดี แต่คุณทำได้ สร้างAggregatedModuleซึ่งจะมีคำอธิบายประกอบ และรวม โมดูล@InstallIn(SingletonComponent::class)
เหล่านี้ทั้งหมด ที่มีคำอธิบาย ประกอบด้วยDagger
@Module(includes = [ <all of these modules > ])
เรียกใช้โครงการ มันจะขึ้นข้อผิดพลาด
ข้อผิดพลาด DisableModuleHasInstallInCheck
หลังจากที่คุณเรียกใช้โครงการHilt
จะพยายามค้นหา คำ อธิบาย@InstallIn
ประกอบสำหรับแต่ละโมดูลซึ่งรวมอยู่ในAggregatedModule
คำอธิบายประกอบด้วย จะทำให้เกิดข้อผิดพลาดหากพบโมดูลที่ไม่ได้ใส่คำอธิบายประกอบเนื่องจากเราไม่ได้ใส่คำอธิบายประกอบทุกโมดูลด้วยเนื่องจากเราอยู่ระหว่างการย้ายข้อมูล เราสามารถปิดใช้งานข้อผิดพลาดนี้โดยใช้แฟล็กต่อไปนี้@Module
Hilt
@Install
@InstallIn
-Adagger.hilt.disableModulesHaveInstallInCheck=true
.
คุณสามารถระบุในระดับแอปbuild.gradle
ได้ด้านล่าง แต่เราควรนำธงนี้ออกเมื่อการย้ายข้อมูลทั้งหมดเสร็จสิ้น
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
ย้ายคลาสแอปพลิเคชัน
หากต้องการเพิ่ม Hilt ลงในแอปพลิเคชัน ให้ใส่คำอธิบายประกอบในApplication
ชั้นเรียนด้วย@HiltAndroidApp
. คุณควรลบ@Component
และ@Component.Builder
ที่มีอยู่ในAppComponent
ชั้นเรียนตามที่กล่าวไว้ข้างต้น
หากคุณApplication
ขยายจากDaggerApplication
หรือนำไปใช้HasAndroidInjector
คุณยังคงต้องเก็บรหัสบางส่วนไว้ด้านล่างในทั้งสองกรณีนี้ เพื่อรองรับทั้งสองDagger
อย่างHilt
ควบคู่กันไปจนกว่าการย้ายข้อมูลทั้งหมดจะเสร็จสมบูรณ์
หากคุณApplication
ขยายจากDaggerApplication
คลาสแอปพลิเคชันของคุณจะมีลักษณะดังนี้
และถ้าคุณApplication
นำไปใช้งานHasAndroidInjector
ของคุณ แอปพลิเคชันของคุณต้องมีลักษณะดังนี้
เมื่อการย้ายข้อมูลทั้งหมดเสร็จสิ้น คุณจะต้องลบรหัสดังกล่าวออกจากApplication
ชั้นเรียนของคุณ และApplication
จะมีลักษณะดังนี้ (แต่นั่นจะเป็นหนึ่งในขั้นตอนสุดท้าย โปรดอย่าทำตอนนี้)
เรียกใช้โครงการ ควรสร้างโครงการของคุณสำเร็จและแอปต้องเปิดโดยไม่มีข้อยกเว้นเวลาทำงาน
ย้ายระดับกิจกรรม
Dagger จัดให้@ContributesAndroidInjector
มีการระบุกิจกรรม/ส่วนย่อยใด ๆ เป็นผู้มีส่วนร่วมสำหรับ Android Injector ในโครงการของเราที่ทำในMainActivityModule
, หนึ่งในโมดูลที่รวมอยู่ในAggregatedModule
MainActivityModule
ลักษณะเช่นนี้ก่อนการย้ายข้อมูล
MainActivity
ลักษณะเช่นนี้ก่อนการย้ายข้อมูล
ในการย้ายข้อมูลของเราMainActivity
ไปที่Hilt
เราจะกำจัดMainActivityModule
โมดูลคลาสทั้งหมดและเพิ่มคำอธิบายประกอบ@AndroidEntryPoint
สำหรับ MainActivity
เนื่องจากเราMainActivity
กำลังขยายจากDaggerAppCompatActivity
เราจำเป็นต้องขยายกิจกรรมของเราจากที่สอดคล้องกันAppCompatActivity
ดังนั้นหลังจากการย้ายข้อมูลของเราMainActivity
จะมีลักษณะดังนี้
ดำเนินโครงการของคุณ ควรจะประสบความสำเร็จด้วยMainActivity
การย้ายข้อมูลไปยังHilt
ย้ายส่วน/มุมมอง/ตัวรับการออกอากาศ
การย้าย Fragment ใดๆ เข้าไปHilt
จะทำด้วยขั้นตอนเดียวกับที่เราทำในการย้ายไปMainActivity
ยัง Hilt ขั้นตอนอยู่ด้านล่าง
- ลบโค้ดที่คุณใส่คำอธิบายประกอบ Fragment ซึ่ง
@ContributesAndroidInjector
น่าจะเป็นโมดูล - ลบโมดูลที่
SingletonComponent
จัดการ@ContributesAndroidInjector
กับ Fragment ของคุณ - ใส่คำอธิบายประกอบส่วนของคุณด้วย
@AndroidEntryPoint
- หากแฟรกเมนต์ของคุณถูกขยายจาก
DaggerFragment
นั้นคุณจำเป็นต้องขยายแฟรกเมนต์จากFragment
คลาส
โยกย้าย ViewModel
การโอนย้าย ViewModel ต้องมีขั้นตอนบางอย่าง
ก่อนอื่นให้ใส่คำอธิบายประกอบ viewModel ของคุณด้วย@HiltViewModel
ในการFeatureViewModel
แทรกเข้าไปHilt
เราจะใช้ส่วนขยายแฟรกเมนต์viewModels()
ที่มีให้ในการพึ่งพาส่วนขยายแฟรกเมนต์ที่เราจะเพิ่มในbuild.gradle
ไฟล์ที่เกี่ยวข้องดังต่อไปนี้
implementation "androidx.fragment:fragment-ktx:1.5.6"
ตอนนี้ลบที่เกี่ยวข้อง@Bind
และ@IntoMap
การ@ViewModelKey
ผูกที่FeatureViewModel
เราใช้สำหรับกริช
ในกริชที่จะฉีด ViewModel เรายังมีlateinit var
คุณสมบัติซึ่งจะอยู่ที่injected
รันไทม์โดยใช้บางส่วนViewModelFactory
ที่ไม่จำเป็นอีกต่อไป ดังนั้นคุณสามารถลบและโค้ดที่เกี่ยวข้องได้หากไม่มี ViewModel/Fragment อื่นที่ยังอยู่บนกริชViewModelModule
ViewModelProviderFactory
ดำเนินโครงการของคุณ ควรจะประสบความสำเร็จด้วยFragment and ViewModel
การย้ายข้อมูลไปยังHilt
โยกย้ายโมดูลอื่น ๆ
จนถึงตอนนี้เรากำลังย้ายComponents
/ Modules
/ Activity
/ Fragment
ในโมดูลแอป แต่เราต้องโอนย้ายโมดูลอื่นๆ ในตอนนี้ เราจะไปทีละโมดูลและย้ายทั้งหมดไปที่ Hilt โดยใช้ขั้นตอนต่อไปนี้
- เพิ่ม
Hilt
การอ้างอิงในbuild.gradle
ไฟล์ของโมดูล - อธิบายแต่ละรายการ
@Module
ด้วย@InstallIn
คำอธิบายประกอบ - ลบ
@JvmStatic
คำอธิบายประกอบสำหรับแต่ละ@Provide
คำอธิบายประกอบ ถ้าคุณมี เนื่องจากไม่จำเป็นอีกต่อไปในHilt
- ใส่คำอธิบายประกอบของคุณ
Fragment
/Activity
ด้วย@AndroidEntryPoint
และลบที่เกี่ยวข้อง@ContributesAndroidInjector
- โอนย้าย ViewModels ของคุณที่มีคำอธิบายประกอบ
@HiltViewModel
และใช้ส่วนขยายส่วนย่อยviewModels()
เพื่อใส่โมเดลมุมมองเหล่านั้น - ทำการลบโมดูลเหล่านั้นทั้งหมดต่อไปซึ่งจะไม่ต้องการอีกต่อไปใน
AggregatedModule
.AggregatedModule
เราสร้างข้างต้นในขั้นตอนแรกของเรา
เมื่อแต่ละโมดูลโครงการถูกย้ายไปยังHilt
. ต้องใช้เวลาทำความสะอาด
- ลบ enableModuleInstallInCheck = true ที่เราเพิ่มเมื่อเริ่มต้นในระดับแอพหรืออื่น ๆ
build.gradle
และลบ@DisableInstallInCheck
คำอธิบายประกอบหากมีการเพิ่มลงไป@Module
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
4. ลบDagger
การอ้างอิงทั้งหมดในโมดูลทั้งหมดของคุณ
รันโปรเจกต์ของคุณ มันควรจะรันโปรเจกต์ของคุณสำเร็จโดยโอนย้ายไปยังHilt
บทสรุปและประเด็นสำคัญ
ภาพรวมระดับสูงของการเปลี่ยนแปลงรหัสหลังการย้ายจะมีลักษณะดังนี้
- คำอธิบายประกอบโค้ดทั้งหมด
@Component
/@Component.Builder
/@Component.Factory
/@ContributesAndroidInjector
/@ViewModelKey
จะถูกลบออก - ViewModels ทั้งหมดของคุณจะต้องใส่คำอธิบายประกอบ
@HiltViewModel
@Module
คลาสทั้งหมด จะต้องมี@InstallIn
คำอธิบายประกอบพร้อมคำอธิบายประกอบ- แฟรกเมนต์/กิจกรรม/มุมมอง/บริการจะต้องมีคำอธิบายประกอบ
@AndroidEntryPoint
- คลาสแอ็พพลิเคชันต้องมีคำอธิบายประกอบ
@HiltAndroidApp
AppComponent
และรหัสที่เกี่ยวข้องจะต้องถูกลบออก@JvmStatic
คำอธิบายประกอบภายในโมดูล Hilt จะต้องไม่มีอยู่อีกต่อไป
- การพึ่งพาการฉีดโดยใช้ Hilt
- โยกย้ายไปยังเอกสารอย่างเป็นทางการของ Hilt
อย่าลืมติดตามและถ้าคุณชอบ :)
— — — — — — — — — — —
GitHub | LinkedIn | ทวิตเตอร์
เพิ่มระดับการเข้ารหัส
ขอบคุณที่เป็นส่วนหนึ่งของชุมชนของเรา! ก่อนที่คุณจะไป:
- ปรบมือให้กับเรื่องราวและติดตามผู้เขียน
- ดูเนื้อหาเพิ่มเติมในสิ่งพิมพ์ Level Up Coding
- หลักสูตรสัมภาษณ์การเข้ารหัสฟรี ⇒ ดูหลักสูตร
- ติดตามเรา: Twitter | LinkedIn | จดหมายข่าว