Menggunakan Hilt dengan library Jetpack lainnya

Hilt menyertakan ekstensi untuk menyediakan class dari library Jetpack lainnya. Saat ini, Hilt mendukung komponen Jetpack berikut:

  • ViewModel
  • Navigasi
  • Compose
  • WorkManager

Anda harus menambahkan dependensi Hilt untuk memanfaatkan integrasi ini. Untuk mengetahui informasi selengkapnya tentang menambahkan dependensi, lihat Injeksi dependensi dengan Hilt.

Menginjeksikan objek ViewModel dengan Hilt

Berikan ViewModel dengan menganotasinya menggunakan @HiltViewModel dan menggunakan anotasi @Inject dalam konstruktor objek ViewModel.

KotlinJava
@HiltViewModel
class ExampleViewModel @Inject constructor(
 
private val savedStateHandle: SavedStateHandle,
 
private val repository: ExampleRepository
) : ViewModel() {
 
...
}
@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;
 
}
 
...
}

Kemudian, aktivitas atau fragmen yang dianotasi dengan @AndroidEntryPoint bisa mendapatkan instance ViewModel seperti biasa menggunakan ekstensi KTX ViewModelProvider atau by viewModels():

KotlinJava
@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
 
private val exampleViewModel: ExampleViewModel by viewModels()
 
...
}
@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);
 
}
 
...
}

@ViewModelScoped

Semua ViewModel Hilt disediakan oleh ViewModelComponent yang mengikuti siklus proses yang sama dengan ViewModel, dan dengan demikian, dapat bertahan saat terjadi perubahan konfigurasi. Untuk mencakup dependensi ke ViewModel, gunakan anotasi @ViewModelScoped.

Jenis @ViewModelScoped akan menjadikannya agar satu instance dari jenis cakupan diberikan di semua dependensi yang dimasukkan ke dalam ViewModel. Instance ViewModel lain yang meminta instance dengan cakupan akan menerima instance yang berbeda.

Jika satu instance perlu dibagikan ke berbagai ViewModel, instance harus dicakup menggunakan @ActivityRetainedScoped atau @Singleton.

Integrasi dengan library navigasi Jetpack

Tambahkan dependensi tambahan berikut ke file Gradle Anda:

app/build.gradle

GroovyKotlin
dependencies {
   
...
    implementation
'androidx.hilt:hilt-navigation-fragment:1.0.0'
}
dependencies {
   
...
    implementation
("androidx.hilt:hilt-navigation-fragment:1.0.0")
}

Jika ViewModel disertakan ke grafik navigasi, gunakan fungsi hiltNavGraphViewModels yang dapat digunakan dengan fragmen yang dianotasi dengan @AndroidEntryPoint.

KotlinJava
val viewModel: ExampleViewModel by hiltNavGraphViewModels(R.id.my_graph)
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.my_graph);

ExampleViewModel exampleViewModel = new ViewModelProvider(
  backStackEntry
,
 
HiltViewModelFactory.create(context, backStackEntry)
).get(ExampleViewModel.class)

Integrasi dengan Jetpack Compose

Untuk melihat cara Hilt berintegrasi dengan Jetpack Compose, lihat bagian Hilt Compose dan library lainnya.

Menginjeksikan WorkManager dengan Hilt

Tambahkan dependensi tambahan berikut ke file Gradle Anda. Perhatikan bahwa selain library, Anda juga perlu menyertakan pemroses anotasi tambahan yang berfungsi mendukung pemroses anotasi Hilt:

app/build.gradle

GroovyKotlin
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'
}
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")
}

Injeksikan Worker menggunakan anotasi @HiltWorker di class dan @AssistedInject di konstruktor objek Worker. Anda hanya dapat menggunakan @Singleton atau binding tidak tercakup dalam objek Worker. Anda juga harus menganotasi dependensi Context dan WorkerParameters dengan @Assisted:

KotlinJava
@HiltWorker
class ExampleWorker @AssistedInject constructor(
 
@Assisted appContext: Context,
 
@Assisted workerParams: WorkerParameters,
  workerDependency
: WorkerDependency
) : Worker(appContext, workerParams) { ... }
@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;
 
}
 
...
}

Kemudian, minta class Application Anda mengimplementasikan antarmuka Configuration.Provider, memasukkan instance HiltWorkFactory, dan meneruskannya ke dalam konfigurasi WorkManager sebagai berikut:

KotlinJava
@HiltAndroidApp
class ExampleApplication : Application(), Configuration.Provider {

 
@Inject lateinit var workerFactory: HiltWorkerFactory

 
override fun getWorkManagerConfiguration() =
     
Configuration.Builder()
           
.setWorkerFactory(workerFactory)
           
.build()
}
@HiltAndroidApp
public class ExampleApplication extends Application implements Configuration.Provider {

 
@Inject HiltWorkerFactory workerFactory;

 
@Override
 
public Configuration getWorkManagerConfiguration() {
   
return new Configuration.Builder()
             
.setWorkerFactory(workerFactory)
             
.build();
 
}
}