Hilt mit anderen Jetpack-Bibliotheken verwenden

Hilt enthält Erweiterungen, mit denen Klassen aus anderen Jetpack-Bibliotheken bereitgestellt werden können. Hilt unterstützt derzeit die folgenden Jetpack-Komponenten:

  • ViewModel
  • Navigation
  • Schreiben
  • WorkManager

Sie müssen die Hilt-Abhängigkeiten hinzufügen, um diese Integrationen nutzen zu können. Für Weitere Informationen zum Hinzufügen von Abhängigkeiten finden Sie unter Abhängigkeitsinjektion mit Hilt.

ViewModel-Objekte mit Hilt einfügen

Geben Sie ein ViewModel an, indem Sie mit @HiltViewModel und die Annotation @Inject in der ViewModel den Konstruktor des Objekts.

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;
  }
  ...
}

Dann kann eine Aktivität oder ein mit @AndroidEntryPoint annotiertes Fragment Rufen Sie die ViewModel-Instanz wie gewohnt mit ViewModelProvider oder dem by viewModels() KTX-Erweiterungen:

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

Alle Hilt ViewModels werden von der ViewModelComponent bereitgestellt, die den denselben Lebenszyklus wie eine ViewModel und können daher auch Konfigurationsänderungen überleben. Um eine Abhängigkeit auf eine ViewModel festzulegen, verwenden Sie die Annotation @ViewModelScoped.

Der Typ @ViewModelScoped sorgt dafür, dass eine einzelne Instanz des wird für alle in ViewModel eingefügten Abhängigkeiten bereitgestellt. Andere Instanzen einer ViewModel, die die beschränkte Instanz anfordern, erhalten in eine andere Instanz.

Wenn eine einzelne Instanz für verschiedene ViewModels freigegeben werden muss, sollte entweder mit @ActivityRetainedScoped oder @Singleton festgelegt werden.

Integration in die Jetpack-Navigationsbibliothek

Fügen Sie Ihrer Gradle-Datei die folgenden zusätzlichen Abhängigkeiten hinzu:

app/build.gradle

Cool

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

Kotlin

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

Wenn Ihre ViewModel auf die Navigation beschränkt ist Grafik hiltNavGraphViewModels-Funktion verwenden, die mit Fragmenten funktioniert, kommentiert mit @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)

Jetpack Compose einbinden

Informationen zur Integration von Hilt in Jetpack Compose finden Sie im Abschnitt "Hilt" des Composer und andere Bibliotheken:

WorkManager mit Hilt einfügen

Fügen Sie Ihrer Gradle-Datei die folgenden zusätzlichen Abhängigkeiten hinzu. Beachten Sie, dass in Neben der Bibliothek müssen Sie einen zusätzlichen Annotationsprozessor der auf dem Hilt-Annotationsprozessor basiert:

app/build.gradle

Cool

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

Injizieren Sie ein Worker mithilfe der @HiltWorker-Annotation in der Klasse und @AssistedInject in der Worker den Konstruktor des Objekts. Sie können nur @Singleton oder Bindungen ohne Geltungsbereich in Worker-Objekte. Sie müssen außerdem die Context und WorkerParameters annotieren. Abhängigkeiten mit @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;
  }
  ...
}

Geben Sie dann Ihren Application-Kurs ein. Configuration.Provider-Schnittstelle implementieren, eine Instanz von HiltWorkFactory und übergeben Sie ihn wie folgt an die WorkManager-Konfiguration:

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