ใช้ Hilt กับไลบรารี Jetpack อื่นๆ

Hilt มีส่วนขยายสำหรับการจัดชั้นเรียนจากไลบรารี Jetpack อื่นๆ ปัจจุบัน Hilt รองรับคอมโพเนนต์ Jetpack ต่อไปนี้

  • ViewModel
  • การไปยังรายการต่างๆ
  • เขียน
  • WorkManager

คุณต้องเพิ่มทรัพยากร Dependency ของ Hilt เพื่อใช้ประโยชน์จากการผสานรวมเหล่านี้ สำหรับ ดูข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่มทรัพยากร Dependency ได้ที่หัวข้อการแทรกการขึ้นต่อกันด้วย 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);
  }
  ...
}

@ViewModelScope

Hilt ViewModels ทั้งหมดจัดเตรียมโดย ViewModelComponent ซึ่งเป็นไปตาม วงจรเดียวกันกับ ViewModel จึงยังคงมีผลต่อการเปลี่ยนแปลงการกําหนดค่า หากต้องการกำหนดขอบเขตทรัพยากร Dependency ไปยัง ViewModel ให้ใช้คำอธิบายประกอบ @ViewModelScoped

ประเภท @ViewModelScoped จะทำให้มีอินสแตนซ์เดียวของขอบเขต ได้รับการจัดให้อยู่ในทรัพยากร Dependency ทั้งหมดที่แทรกลงใน ViewModel อินสแตนซ์อื่นๆ ของ ViewModel ที่ขออินสแตนซ์ที่กำหนดขอบเขต อินสแตนซ์อื่น

หากต้องแชร์อินสแตนซ์เดียวใน ViewModel ต่างๆ ควรกำหนดขอบเขตโดยใช้ @ActivityRetainedScoped หรือ @Singleton

การผสานรวมกับไลบรารีการนำทางของ Jetpack

เพิ่มทรัพยากร Dependency เพิ่มเติมต่อไปนี้ลงในไฟล์ 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

เพิ่มทรัพยากร Dependency เพิ่มเติมต่อไปนี้ลงในไฟล์ 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 ของออบเจ็กต์ คุณสามารถใช้การเชื่อมโยงหรือไม่ใช้ได้เพียง @Singleton รายการเท่านั้นใน Worker ออบเจ็กต์ คุณต้องใส่คำอธิบายประกอบให้กับ Context และ WorkerParameters ด้วย ทรัพยากร Dependency ที่มี @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();
  }
}