Używanie Hilt z innymi bibliotekami Jetpack

Hilt zawiera rozszerzenia umożliwiające udostępnianie zajęć z innych bibliotek Jetpack. Hilt obsługuje obecnie te komponenty Jetpack:

  • ViewModel
  • Nawigacja
  • Utwórz
  • Menedżer pracy

Aby skorzystać z tych integracji, musisz dodać zależności Hilt. Więcej informacji o dodawaniu zależności znajdziesz w artykule o wstrzykiwaniu zależności za pomocą Hilt.

Wstrzyknij obiekty ViewModel za pomocą Hilt

Podaj ViewModel, oznaczając go adnotacjami @HiltViewModel i korzystając z adnotacji @Inject w konstruktorze obiektu 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;
  }
  ...
}

Następnie aktywność lub fragment z adnotacjami @AndroidEntryPoint mogą pobrać wystąpienie ViewModel w zwykły sposób przy użyciu ViewModelProvider lub by viewModels() rozszerzeń 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);
  }
  ...
}

@ViewModelScoped

Wszystkie modele widoków danych Hilt są dostarczane przez model ViewModelComponent, który postępuje zgodnie z tym samym cyklem życia co obiekt ViewModel, więc mogą przetrwać zmiany konfiguracji. Aby określić zakres zależności do ViewModel, użyj adnotacji @ViewModelScoped.

Typ @ViewModelScoped sprawi, że we wszystkich zależnościach wstawionych w interfejsie ViewModel będzie dostępna jedna instancja o zakresie zakresu. Inne instancje ViewModel, które żądają instancji o zakresie, otrzymają inną instancję.

Jeśli pojedyncza instancja ma być współużytkowana przez różne obiekty ViewModel, powinna mieć zakres ograniczony za pomocą @ActivityRetainedScoped lub @Singleton.

Integracja z biblioteką nawigacji Jetpack

Dodaj do pliku Gradle te dodatkowe zależności:

app/build.gradle,

Odlotowy

dependencies {
    ...
    implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0'
}

Kotlin

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

Jeśli ViewModel jest ograniczony do wykresu nawigacyjnego, użyj funkcji hiltNavGraphViewModels, która współpracuje z fragmentami z adnotacjami @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)

Integracja z Jetpack Compose

Aby dowiedzieć się, jak Hilt integruje się z Jetpack Compose, zapoznaj się z sekcją Hilt w artykule o tworzeniu i innych bibliotekach.

Wstrzyknij WorkManager za pomocą Hilt

Dodaj poniższe dodatkowe zależności do pliku Gradle. Pamiętaj, że oprócz biblioteki trzeba uwzględnić dodatkowy procesor adnotacji, który działa poza procesorem adnotacji Hilt:

app/build.gradle,

Odlotowy

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

Wstaw Worker za pomocą adnotacji @HiltWorker w klasie i @AssistedInject w konstruktorze obiektu Worker. W obiektach Worker możesz używać tylko powiązań @Singleton lub powiązań bez zakresu. Musisz też dodać adnotacje do zależności Context i WorkerParameters za pomocą atrybutu @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;
  }
  ...
}

Następnie dodaj klasę Application do interfejsu Configuration.Provider, wstrzyknij wystąpienie elementu HiltWorkFactory i przekaż je do konfiguracji WorkManager w ten sposób:

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