Hilt มีส่วนขยายสำหรับการจัดชั้นเรียนจากไลบรารี Jetpack อื่นๆ ปัจจุบัน Hilt รองรับคอมโพเนนต์ Jetpack ต่อไปนี้
ViewModel
- การไปยังรายการต่างๆ
- เขียน
- WorkManager
คุณต้องเพิ่มทรัพยากร Dependency ของ Hilt เพื่อใช้ประโยชน์จากการผสานรวมเหล่านี้ สำหรับ ดูข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่มทรัพยากร Dependency ได้ที่หัวข้อการแทรกการขึ้นต่อกันด้วย Hilt
แทรกวัตถุ ViewModel ด้วย Hilt
ป้อน ViewModel
ด้วยการใส่คำอธิบายประกอบ
พร้อมกับ @HiltViewModel
และใช้คำอธิบายประกอบ @Inject
ใน ViewModel
ของออบเจ็กต์
Kotlin
@HiltViewModel class ExampleViewModel @Inject constructor( private val savedStateHandle: SavedStateHandle, private val repository: ExampleRepository ) : ViewModel() { ... }
Java
@HiltViewModel public class ExampleViewModel extends ViewModel { private final ExampleRepository repository; private final SavedStateHandle savedStateHandle; @Inject ExampleViewModel( SavedStateHandle savedStateHandle, ExampleRepository repository) { this.savedStateHandle = savedStateHandle; this.repository = repository; } ... }
จากนั้นกิจกรรมหรือส่วนย่อยที่มีคำอธิบายประกอบด้วย @AndroidEntryPoint
สามารถ
รับอินสแตนซ์ ViewModel
ตามปกติโดยใช้ ViewModelProvider
หรือ
by viewModels()
ส่วนขยาย KTX:
Kotlin
@AndroidEntryPoint class ExampleActivity : AppCompatActivity() { private val exampleViewModel: ExampleViewModel by viewModels() ... }
Java
@AndroidEntryPoint public class ExampleActivity extends AppCompatActivity { private ExampleViewModel exampleViewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); exampleViewModel = new ViewModelProvider(this).get(ExampleViewModel.class); } ... }
@ViewModelScope
Hilt ViewModels ทั้งหมดจัดเตรียมโดย ViewModelComponent
ซึ่งเป็นไปตาม
วงจรเดียวกันกับ ViewModel
จึงยังคงมีผลต่อการเปลี่ยนแปลงการกําหนดค่า
หากต้องการกำหนดขอบเขตทรัพยากร Dependency ไปยัง ViewModel
ให้ใช้คำอธิบายประกอบ @ViewModelScoped
ประเภท @ViewModelScoped
จะทำให้มีอินสแตนซ์เดียวของขอบเขต
ได้รับการจัดให้อยู่ในทรัพยากร Dependency ทั้งหมดที่แทรกลงใน ViewModel
อินสแตนซ์อื่นๆ ของ ViewModel ที่ขออินสแตนซ์ที่กำหนดขอบเขต
อินสแตนซ์อื่น
หากต้องแชร์อินสแตนซ์เดียวใน ViewModel ต่างๆ
ควรกำหนดขอบเขตโดยใช้ @ActivityRetainedScoped
หรือ @Singleton
การผสานรวมกับไลบรารีการนำทางของ Jetpack
เพิ่มทรัพยากร Dependency เพิ่มเติมต่อไปนี้ลงในไฟล์ Gradle
ดึงดูด
dependencies { ... implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0' }
Kotlin
dependencies { ... implementation("androidx.hilt:hilt-navigation-fragment:1.0.0") }
หากViewModel
ของคุณกำหนดขอบเขตไว้ที่การนำทาง
กราฟ
ใช้ฟังก์ชัน hiltNavGraphViewModels
ที่ทำงานกับส่วนย่อยที่
มีคำอธิบายประกอบ @AndroidEntryPoint
แล้ว
Kotlin
val viewModel: ExampleViewModel by hiltNavGraphViewModels(R.id.my_graph)
Java
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.my_graph); ExampleViewModel exampleViewModel = new ViewModelProvider( backStackEntry, HiltViewModelFactory.create(context, backStackEntry) ).get(ExampleViewModel.class)
การผสานรวมกับ Jetpack Compose
หากต้องการดูว่า Hilt ผสานรวมกับ Jetpack Compose อย่างไร โปรดดูส่วน Hilt ของ เขียนและไลบรารีอื่นๆ
แทรก WorkManager ด้วย Hilt
เพิ่มทรัพยากร Dependency เพิ่มเติมต่อไปนี้ลงในไฟล์ Gradle โปรดทราบว่าใน นอกเหนือจากไลบรารีแล้ว คุณจะต้องรวม ตัวประมวลผลคำอธิบายประกอบเพิ่มเติม ที่ทำงานบนโปรเซสเซอร์คำอธิบายประกอบ Hilt
ดึงดูด
dependencies { ... implementation 'androidx.hilt:hilt-work:1.0.0' // When using Kotlin. kapt 'androidx.hilt:hilt-compiler:1.0.0' // When using Java. annotationProcessor 'androidx.hilt:hilt-compiler:1.0.0' }
Kotlin
dependencies { implementation("androidx.hilt:hilt-work:1.0.0") // When using Kotlin. kapt("androidx.hilt:hilt-compiler:1.0.0") // When using Java. annotationProcessor("androidx.hilt:hilt-compiler:1.0.0") }
แทรก Worker
โดยใช้
คำอธิบายประกอบ @HiltWorker
รายการในชั้นเรียน และ @AssistedInject
ใน Worker
ของออบเจ็กต์ คุณสามารถใช้การเชื่อมโยงหรือไม่ใช้ได้เพียง @Singleton
รายการเท่านั้นใน
Worker
ออบเจ็กต์ คุณต้องใส่คำอธิบายประกอบให้กับ Context
และ WorkerParameters
ด้วย
ทรัพยากร Dependency ที่มี @Assisted
:
Kotlin
@HiltWorker class ExampleWorker @AssistedInject constructor( @Assisted appContext: Context, @Assisted workerParams: WorkerParameters, workerDependency: WorkerDependency ) : Worker(appContext, workerParams) { ... }
Java
@HiltWorker public class ExampleWorker extends Worker { private final WorkerDependency workerDependency; @AssistedInject ExampleWorker( @Assisted @NonNull Context context, @Assisted @NonNull WorkerParameters params, WorkerDependency workerDependency ) { super(context, params); this.workerDependency = workerDependency; } ... }
จากนั้น ให้ชั้นเรียน Application
ของคุณ
ใช้อินเทอร์เฟซ Configuration.Provider
โดยแทรกอินสแตนซ์ของ
HiltWorkFactory
และส่งต่อไปในการกำหนดค่า WorkManager
ดังนี้
Kotlin
@HiltAndroidApp class ExampleApplication : Application(), Configuration.Provider { @Inject lateinit var workerFactory: HiltWorkerFactory override fun getWorkManagerConfiguration() = Configuration.Builder() .setWorkerFactory(workerFactory) .build() }
Java
@HiltAndroidApp public class ExampleApplication extends Application implements Configuration.Provider { @Inject HiltWorkerFactory workerFactory; @Override public Configuration getWorkManagerConfiguration() { return new Configuration.Builder() .setWorkerFactory(workerFactory) .build(); } }