Dependency Injection (DI) là một kỹ thuật lập trình giúp quản lý các phụ thuộc (dependencies) giữa các lớp. DI mang lại nhiều lợi ích như:
Hilt là một thư viện DI được Google phát triển dựa trên Dagger, được tối ưu hóa cho Android. Hilt giúp tự động hóa việc tạo và quản lý các dependencies, đồng thời tích hợp chặt chẽ với vòng đời của các thành phần Android như Activity, Fragment, ViewModel,…
build.gradleĐầu tiên, bạn cần thêm các plugin và dependencies cần thiết vào tệp build.gradle của module:
// build.gradle (Module)
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("kotlin-kapt")
id("dagger.hilt.android.plugin") // Thêm plugin Hilt
}
dependencies {
implementation("com.google.dagger:hilt-android:2.51.1")
kapt("com.google.dagger:hilt-android-compiler:2.51.1")
// Hilt cho ViewModel
implementation("androidx.hilt:hilt-lifecycle-viewmodel:1.0.0")
kapt("androidx.hilt:hilt-compiler:1.0.0")
}
kapt {
correctErrorTypes = true
}
Tạo một lớp kế thừa từ Application và thêm annotation @HiltAndroidApp để Hilt có thể khởi tạo:
@HiltAndroidApp
class MyApp : Application()
AndroidManifest.xmlKhai báo lớp Application trong tệp AndroidManifest.xml:
<application
android:name=".MyApp"
...>
</application>
Tạo một lớp UserRepository và sử dụng annotation @Inject để Hilt biết cách khởi tạo nó:
class UserRepository @Inject constructor() {
fun getUser() = "John Doe"
}
Sử dụng annotation @AndroidEntryPoint để cho phép Hilt inject dependencies vào Activity:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var userRepository: UserRepository
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val user = userRepository.getUser()
Toast.makeText(this, "User: $user", Toast.LENGTH_SHORT).show()
}
}
Để cung cấp một instance của Retrofit, bạn cần tạo một @Module và sử dụng annotation @Provides:
@Module
@InstallIn(SingletonComponent::class) // Scope: Application-level
object NetworkModule {
@Provides
@Singleton
fun provideRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
}
@Provides
fun provideApiService(retrofit: Retrofit): ApiService {
return retrofit.create(ApiService::class.java)
}
}
Inject ApiService vào UserRepository:
class UserRepository @Inject constructor(
private val apiService: ApiService // Inject Retrofit Service
) {
suspend fun fetchUser() = apiService.getUser()
}
Hilt hỗ trợ inject dependencies trực tiếp vào ViewModel với annotation @HiltViewModel:
@HiltViewModel
class UserViewModel @Inject constructor(
private val userRepository: UserRepository
) : ViewModel() {
private val _user = MutableStateFlow<String?>(null)
val user: StateFlow<String?> = _user
fun loadUser() {
viewModelScope.launch {
_user.value = userRepository.fetchUser()
}
}
}
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewModel: UserViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.loadUser()
viewModel.user.observe(this) { user ->
Toast.makeText(this, "User: $user", Toast.LENGTH_SHORT).show()
}
}
}
Hilt quản lý scope của dependencies dựa trên vòng đời của các thành phần Android:
@Module
@InstallIn(ActivityComponent::class) // Scope: Activity-level
object ActivityModule {
@Provides
@ActivityScoped // Sống cùng Activity
fun provideAnalytics(): AnalyticsService = FirebaseAnalytics()
}
Hilt giúp đơn giản hóa việc quản lý dependencies trong Android với các lợi ích:
Hãy thử áp dụng Hilt vào dự án của bạn để tận hưởng những lợi ích mà nó mang lại!
You need to login in order to like this post: click here
YOU MIGHT ALSO LIKE