Используйте Hilt с другими библиотеками Jetpack,Используйте Hilt с другими библиотеками Jetpack

Hilt включает расширения для предоставления классов из других библиотек Jetpack. В настоящее время Hilt поддерживает следующие компоненты Jetpack:

  • ViewModel
  • Навигация
  • Сочинить
  • Менеджер работ

Вы должны добавить зависимости Hilt, чтобы воспользоваться преимуществами этой интеграции. Дополнительные сведения о добавлении зависимостей см. в разделе Внедрение зависимостей с помощью Hilt .

Внедрение объектов ViewModel с помощью Hilt

Предоставьте ViewModel , добавив к нему аннотацию @HiltViewModel и используя аннотацию @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 может получить экземпляр ViewModel как обычно, используя ViewModelProvider или расширения KTX by viewModels() :

Котлин

@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 предоставляются ViewModelComponent , который имеет тот же жизненный цикл, что и ViewModel , и поэтому может пережить изменения конфигурации. Чтобы определить зависимость от ViewModel используйте аннотацию @ViewModelScoped .

Тип @ViewModelScoped сделает так, что один экземпляр типа с ограниченной областью будет предоставлен для всех зависимостей, внедренных в ViewModel . Другие экземпляры ViewModel, запрашивающие экземпляр с заданной областью, получат другой экземпляр.

Если один экземпляр необходимо использовать в различных ViewModel, его область следует определить с помощью @ActivityRetainedScoped или @Singleton .

Интеграция с навигационной библиотекой Jetpack.

Добавьте следующие дополнительные зависимости в ваш файл Gradle:

приложение/build.gradle

классный

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

Котлин

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

Если ваша ViewModel ограничена графом навигации , используйте функцию hiltNavGraphViewModels , которая работает с фрагментами, помеченными с помощью @AndroidEntryPoint .

Котлин

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, см. раздел Hilt Compose и других библиотек .

Внедрение WorkManager с помощью Hilt

Добавьте следующие дополнительные зависимости в ваш файл Gradle. Обратите внимание, что помимо библиотеки вам необходимо включить дополнительный обработчик аннотаций, который работает поверх обработчика аннотаций Hilt:

приложение/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")
}

Внедрите Worker , используя аннотацию @HiltWorker в классе и @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();
  }
}