Używanie Hilt z innymi bibliotekami Jetpack

Hilt zawiera rozszerzenia do udostępniania klas z innych bibliotek Jetpack. Hilt obsługuje obecnie te komponenty Jetpack:

  • ViewModel
  • Nawigacja
  • Compose
  • Menedżer roboczy

Aby korzystać z tych integracji, musisz dodać zależności Hilt. Dla: więcej informacji o dodawaniu zależności znajdziesz w artykule Wstrzykiwanie zależności za pomocą Hilt.

Wstrzykiwanie obiektów ViewModel za pomocą Hilt

Podaj ViewModel, dodając adnotacje go w @HiltViewModel i przy użyciu adnotacji @Inject w ViewModel za pomocą konstruktora obiektu.

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 adnotacją @AndroidEntryPoint może pobierz instancję ViewModel w zwykły sposób za pomocą interfejsu ViewModelProvider lub by viewModels() Rozszerzenia 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 Hilt są dostarczane przez ViewModelComponent zgodny z ten sam cykl życia co ViewModel, dzięki czemu mogą przetrwać zmiany konfiguracji. Aby ograniczyć zależność do ViewModel, użyj adnotacji @ViewModelScoped.

Typ @ViewModelScoped sprawi, że pojedyncze wystąpienie zakresu jest podany we wszystkich zależnościach wstrzykiwanych do typu ViewModel. Inne instancje ViewModel, które wysyłają żądania do instancji o zakresie w zakresie do innej instancji.

Jeśli pojedyncza instancja musi być współdzielona przez różne modele widoku, powinien być ograniczony za pomocą atrybutu @ActivityRetainedScoped lub @Singleton.

Integracja z biblioteką nawigacji Jetpack

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

app/build.gradle

Odlotowe

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 nawigacji wykres, użyj funkcji hiltNavGraphViewModels, która działa z fragmentami, które są dodano adnotację @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 Utwórz i inne biblioteki.

Wstrzykiwanie narzędzia WorkManager za pomocą Hilt

Dodaj następujące dodatkowe zależności do pliku Gradle. Pamiętaj, że w polu musisz dodać do biblioteki dodatkowy procesor adnotacji, który działa na procesorach adnotacji Hilt:

app/build.gradle

Odlotowe

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

Wstrzyknij Worker za pomocą Adnotacja @HiltWorker w zajęciach i @AssistedInject w Worker za pomocą konstruktora obiektu. W usłudze możesz używać tylko powiązań @Singleton lub powiązań bez zakresu Worker obiektów. Musisz też dodać adnotacje do Context i WorkerParameters zależności z wartością @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 weź udział w zajęciach na zajęciach Application zaimplementuj interfejs Configuration.Provider, wstaw instancję HiltWorkFactory i przekaż go do konfiguracji WorkManager w następujący 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();
  }
}