استخدام Hilt مع مكتبات Jetpack الأخرى

تتضمّن Hilt إضافات لتقديم صفوف من مكتبات Jetpack الأخرى. تتوافق Hilt حاليًا مع مكوّنات Jetpack التالية:

  • ViewModel
  • التنقّل
  • إنشاء
  • مدير العمل

يجب إضافة تبعيات Hilt للاستفادة من عمليات الدمج هذه. بالنسبة لمزيد من المعلومات حول إضافة التبعيات، راجع إدخال التبعية مع Hilt.

إدخال كائنات ViewModel باستخدام Hilt

يمكنك تقديم ViewModel من خلال إضافة تعليقات توضيحية. مع @HiltViewModel واستخدام التعليق التوضيحي @Inject في 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;
  }
  ...
}

بعد ذلك، يمكن لأي نشاط أو جزء تمت إضافة تعليقات توضيحية إليه باستخدام @AndroidEntryPoint. الحصول على المثيل ViewModel كالمعتاد باستخدام ViewModelProvider أو by viewModels() إضافات 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

توفّر "ViewModelComponent" جميع نماذج Hilt ViewModels التي تلي دورة الحياة نفسها مثل ViewModel، وبالتالي يمكنها البقاء على قيد الحياة عند إجراء تغييرات في الإعدادات. لتحديد نطاق التبعية إلى ViewModel، استخدِم التعليق التوضيحي @ViewModelScoped.

سيُجري نوع @ViewModelScoped ذلك بحيث يكون مثيل واحد لنطاق النطاق نوع البيانات على مستوى جميع الاعتماديات التي تم إدخالها في ViewModel. ستتلقَّى الحالات الأخرى من ViewModel التي تطلب المثيل ذي النطاق مثيل مختلف.

وإذا كانت هناك حاجة لمشاركة مثيل واحد عبر نماذج ViewModels المختلفة، يجب تحديد نطاقه باستخدام @ActivityRetainedScoped أو @Singleton.

الدمج مع مكتبة التنقّل في Jetpack

أضف التبعيات الإضافية التالية إلى ملف Gradle:

app/build.gradle

Groovy

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

Kotlin

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

إذا كان ViewModel على مستوى التنقل الرسم البياني، تستخدم الدالة hiltNavGraphViewModels التي تعمل مع الأجزاء تمت إضافة تعليقات توضيحية إليه باستخدام @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

لمعرفة كيفية تكامل Hilt مع Jetpack Compose، يمكنك الاطّلاع على القسم Hilt الإنشاء والمكتبات الأخرى:

إدخال WorkManager باستخدام Hilt

أضف التبعيات الإضافية التالية إلى ملف Gradle الخاص بك. لاحظ أنه في بالإضافة إلى المكتبة، يجب تضمين معالج إضافي للتعليقات التوضيحية التي تعمل في أعلى معالِج التعليقات التوضيحية في Hilt:

app/build.gradle

Groovy

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

يمكنك إدخال Worker باستخدام التعليق التوضيحي @HiltWorker في الصف و@AssistedInject في Worker الدالة الإنشائية للكائن. يمكنك استخدام @Singleton فقط أو عمليات الربط غير المحدَّدة النطاق في Worker عناصر يجب أيضًا إضافة تعليقات توضيحية على Context وWorkerParameters. التبعيات ذات القيمة @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;
  }
  ...
}

بعد ذلك، اطلب من صفك في Application تنفيذ الواجهة Configuration.Provider، وإدخال مثيل HiltWorkFactory، وتمريره في إعداد WorkManager على النحو التالي:

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