שימוש ב-Hilt עם ספריות אחרות של Jetpack

Hilt כולל תוספים לאספקת כיתות מספריות אחרות של Jetpack. בשלב הזה, Hilt תומך ברכיבי Jetpack הבאים:

  • ViewModel
  • ניווט
  • פיתוח נייטיב
  • מנהל עבודה

חייבים להוסיף את יחסי התלות של Hilt כדי לנצל את השילובים האלה. עבור למידע נוסף על הוספת יחסי תלות, ראו החדרת תלות באמצעות עילית.

החדרת אובייקטים של ViewModel באמצעות Hilt

מוסיפים ViewModel בהערה אותו עם @HiltViewModel ושימוש בהערה @Inject בViewModel של ה-constructor של האובייקט.

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

כל המודלים של Hilt ViewModel מסופקים על ידי ה-ViewModelComponent לפי אותו מחזור חיים כמו ViewModel, ולכן הוא יכול לשרוד שינויים בתצורה. כדי להגביל את התלות ב-ViewModel, צריך להשתמש בהערה @ViewModelScoped.

סוג @ViewModelScoped יהפוך למופע אחד של ההיקף השדה 'סוג' מסופק בכל יחסי התלות שמוחדרים אל ViewModel. מופעים אחרים של ViewModel שמבקשים את המכונה של ההיקף יקבלו מופע אחר.

אם צריך לשתף מופע אחד בין מודלים שונים של ViewModels, צריך להיות בהיקף של @ActivityRetainedScoped או @Singleton.

שילוב עם ספריית הניווט של Jetpack

מוסיפים את יחסי התלות הנוספים הבאים לקובץ Gradle:

app/build.gradle

מגניב

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

מגניב

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 של ה-constructor של האובייקט. אפשר להשתמש רק ב-@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();
  }
}