Hilt에는 다른 Jetpack 라이브러리의 클래스를 제공하기 위한 확장 프로그램이 포함되어 있습니다. Hilt는 현재 다음 Jetpack 구성요소를 지원합니다.
ViewModel
- 탐색
- Compose
- WorkManager
이러한 통합을 활용하려면 Hilt 종속 항목을 추가해야 합니다. 종속 항목 추가에 관한 자세한 내용은 Hilt를 사용한 종속 항목 삽입을 참고하세요.
Hilt로 ViewModel 객체 삽입
@HiltViewModel
로 주석 처리하고 ViewModel
객체의 생성자에서 @Inject
주석을 사용하여 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;
}
...
}
그런 다음, @AndroidEntryPoint
주석이 지정된 활동 또는 프래그먼트는 ViewModelProvider
또는 by viewModels()
KTX 확장 프로그램을 사용하여 평소와 같이 ViewModel
인스턴스를 가져올 수 있습니다.
@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
모든 Hilt ViewModel은 ViewModel
과 동일한 수명 주기를 따르는 ViewModelComponent
에서 제공되며, 따라서 구성 변경 후에도 유지될 수 있습니다.
종속 항목의 범위를 ViewModel
로 지정하려면 @ViewModelScoped
주석을 사용하세요.
@ViewModelScoped
유형을 사용하면 ViewModel
에 삽입된 모든 종속 항목에 걸쳐 범위가 지정된 유형의 단일 인스턴스가 제공됩니다.
범위가 지정된 인스턴스를 요청하는 ViewModel의 다른 인스턴스는 다른 인스턴스를 수신합니다.
단일 인스턴스를 다양한 ViewModel에서 공유해야 하는 경우 @ActivityRetainedScoped
또는 @Singleton
을 사용하여 범위를 지정해야 합니다.
Jetpack 탐색 라이브러리와 통합
Gradle 파일에 다음과 같은 종속 항목을 추가합니다.
app/build.gradle
dependencies {
...
implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0'
}
dependencies {
...
implementation("androidx.hilt:hilt-navigation-fragment:1.0.0")
}
ViewModel
의 범위가 탐색 그래프로 지정된 경우 @AndroidEntryPoint
로 주석 처리된 프래그먼트에서 작동하는 hiltNavGraphViewModels
함수를 사용합니다.
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)
Jetpack Compose와 통합
Hilt가 Jetpack Compose와 통합되는 방식은 Compose 및 기타 라이브러리의 Hilt 섹션을 참고하세요.
Hilt로 WorkManager 삽입
Gradle 파일에 다음과 같은 종속 항목을 추가합니다. 라이브러리 외에도 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")
}
클래스의 @HiltWorker
주석과 Worker
객체의 생성자의 @AssistedInject
를 사용하여 Worker
를 삽입합니다. Worker
객체에는 @Singleton
또는 범위가 지정되지 않은 결합만 사용할 수 있습니다. 또한 다음과 같이 Context
및 WorkerParameters
종속 항목에 @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;
}
...
}
그리고 다음과 같이 Application
클래스가 Configuration.Provider
인터페이스를 구현하도록 하고 HiltWorkFactory
인스턴스를 삽입하여 WorkManager
구성에 전달합니다.
@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();
}
}