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
.
@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()
:
@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
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
.
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
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
:
@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:
@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();
}
}