Utilizzare Hilt con altre librerie Jetpack

Hilt include estensioni per fornire corsi di altre librerie Jetpack. Attualmente Hilt supporta i seguenti componenti Jetpack:

  • ViewModel
  • Navigazione
  • Compose
  • Responsabile del lavoro

Per sfruttare queste integrazioni, devi aggiungere le dipendenze Hilt. Per Per saperne di più sull'aggiunta di dipendenze, consulta Inserimento delle dipendenze con Elsa.

Inserisci oggetti ViewModel con Hilt

Fornisci una ViewModel aggiungendo annotazioni con @HiltViewModel e utilizzando l'annotazione @Inject in ViewModel costruttore dell'oggetto.

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

Quindi, un'attività o un frammento annotato con @AndroidEntryPoint può ottieni l'istanza ViewModel normalmente utilizzando ViewModelProvider o by viewModels() Estensioni 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

Tutti i ViewModel Hilt sono forniti dall'ViewModelComponent, che segue le lo stesso ciclo di vita di un ViewModel e, come tale, può sopravvivere alle modifiche alla configurazione. Per limitare l'ambito di una dipendenza a un ViewModel, utilizza l'annotazione @ViewModelScoped.

Un tipo @ViewModelScoped renderà in modo che una singola istanza dell'ambito viene fornito in tutte le dipendenze inserite in ViewModel. Le altre istanze di un ViewModel che richiedono l'istanza con ambito riceveranno per un'altra istanza.

Se una singola istanza deve essere condivisa tra più ViewModel, deve essere limitato utilizzando @ActivityRetainedScoped o @Singleton.

Integrazione con la libreria di navigazione Jetpack

Aggiungi le seguenti dipendenze aggiuntive al file Gradle:

app/build.gradle

Alla moda

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

Kotlin

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

Se ViewModel è limitato alla navigazione grafico, la funzione hiltNavGraphViewModels che funziona con i frammenti annotato con @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)

Integrazione con Jetpack Compose

Per scoprire come Hilt si integra con Jetpack Compose, consulta la sezione Hilt di Compose e altre librerie.

Inserisci WorkManager con Hilt

Aggiungi le seguenti dipendenze aggiuntive al file Gradle. Tieni presente che oltre alla libreria, devi includere un altro processore di annotazione che si basa sul processore di annotazione Hilt:

app/build.gradle

Alla moda

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

Inserisci un elemento Worker utilizzando @HiltWorker annotazione nel corso e @AssistedInject in Worker costruttore dell'oggetto. Puoi utilizzare solo @Singleton o associazioni senza ambito in Worker oggetti. Devi anche annotare Context e WorkerParameters con @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;
  }
  ...
}

Quindi, chiedi al tuo corso Application. implementare l'interfaccia Configuration.Provider, inserire un'istanza HiltWorkFactory e passalo alla configurazione WorkManager come segue:

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