Cách khắc phục lỗi [Dagger/MissingBinding] trong Hilt: Hướng dẫn thực tế

intermediate📱 Android2026-06-12| Android Studio (Giraffe hoặc mới hơn), Hilt 2.48+, Kotlin 1.9+, KSP hoặc KAPT

Error Message

error: [Dagger/MissingBinding] com.example.Repository cannot be provided without an @Inject constructor or an @Provides-annotated method.
#android#hilt#dagger#kotlin#dependency-injection

Cách khắc phục nhanhHilt đưa ra lỗi này khi nó gặp một dependency (phụ thuộc) nhưng không có hướng dẫn về cách tạo ra nó. Hãy coi Hilt như một nhà máy; nếu bạn không cung cấp bản thiết kế, dây chuyền lắp ráp sẽ dừng lại. Hãy làm theo hệ thống phân cấp này để khắc phục:

  • Đối với các class của chính bạn: Thêm @Inject constructor() vào class.- Đối với các interface: Sử dụng @Binds trong một Hilt Module để liên kết interface với một bản thực thi (implementation).- Đối với các thư viện bên ngoài: Sử dụng @Provides trong một Hilt Module cho các class như Retrofit, Room, hoặc OkHttp.- Đối với các Module: Đảm bảo module của bạn có cả annotation @Module@InstallIn.## Tại sao lỗi này xảy ra?Dagger/Hilt là một framework dạng compile-time (thời điểm biên dịch). Không giống như các công cụ dựa trên reflection (phản chiếu) tìm kiếm dependency khi ứng dụng đang chạy, Hilt xác thực mọi thứ trong khi bạn build APK. Nếu một 'mắt xích' trong đồ thị dependency bị thiếu, toàn bộ quá trình biên dịch sẽ thất bại. Điều này giúp ngăn chặn crash khi ứng dụng đang chạy nhưng lại dẫn đến thông báo MissingBinding đáng sợ trong lúc build.

Trường hợp 1: Quên annotation @InjectĐây là nguyên nhân phổ biến nhất. Bạn có thể đã chuẩn bị sẵn một class, nhưng Hilt không biết rằng nó được phép khởi tạo class đó. Chỉ cần thêm annotation này sẽ giải quyết được 90% các class tùy chỉnh.

// ❌ Hilt không nhận diện được class này
class AnalyticsService {
    fun logEvent(name: String) { }
}

// ✅ Hilt hiện đã biết cách tạo instance này
class AnalyticsService @Inject constructor() {
    fun logEvent(name: String) { }
}

Trường hợp 2: Inject các InterfaceBạn không thể 'khởi tạo' một interface. Khi bạn yêu cầu Hilt inject AuthRepository, nó cần biết bản thực thi cụ thể nào sẽ được sử dụng. Bạn cung cấp ánh xạ này bằng cách sử dụng một abstract class và annotation @Binds. Cách này tiết kiệm bộ nhớ hơn @Provides vì Hilt không cần tạo một factory class riêng biệt.

interface AuthRepository {
    fun login(): Boolean
}

class AuthRepositoryImpl @Inject constructor() : AuthRepository {
    override fun login() = true
}

@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {
    @Binds
    abstract fun bindAuthRepository(
        impl: AuthRepositoryImpl
    ): AuthRepository
}

Trường hợp 3: Thư viện bên thứ ba (Retrofit & Room)Bạn không thể thêm @Inject vào code mà bạn không viết. Nếu bạn đang sử dụng Retrofit, bạn phải chỉ cho Hilt chính xác cách cấu hình builder. Sử dụng annotation @Provides bên trong một module object cho các trường hợp này.

@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
    @Provides
    fun provideRetrofit(): Retrofit {
        return Retrofit.Builder()
            .baseUrl("https://api.example.com/v1/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }
}

Trường hợp 4: Sai lệch Scope (Phạm vi)Đôi khi binding tồn tại, nhưng nó lại nằm sai component. Nếu bạn định nghĩa một binding trong ActivityComponent nhưng cố gắng inject nó vào một Service hoặc một WorkManager, Hilt sẽ báo lỗi. Hãy kiểm tra kỹ giá trị @InstallIn của bạn. SingletonComponent có sẵn ở mọi nơi, trong khi ActivityComponent bị giới hạn trong các Activity.

Danh sách kiểm tra lỗi- Clean Project: Chạy ./gradlew clean. Code Dagger được tạo ra thường bị lỗi thời sau khi cấu trúc lại (refactoring).- Kiểm tra tham số constructor: Nếu class của bạn nhận vào ba đối số, Hilt phải biết cách cung cấp cả ba. Nếu chỉ thiếu một cái, toàn bộ class sẽ không thể bind.- Xác minh KSP/KAPT: Nếu bạn vừa chuyển sang KSP, hãy đảm bảo bạn đã thay thế kapt "com.google.dagger:hilt-compiler:..." bằng ksp "com.google.dagger:hilt-compiler:..." trong file build.gradle.- Qualifiers: Nếu bạn có hai hằng số String khác nhau được inject, bạn phải sử dụng @Named hoặc các qualifier tùy chỉnh để giúp Hilt phân biệt giữa chúng.## Xác minhĐể xác minh việc khắc phục, hãy mở cửa sổ Build output trong Android Studio. Việc sửa lỗi thành công sẽ dẫn đến thông báo "BUILD SUCCESSFUL" trong nhật ký. Nếu tò mò, bạn có thể khám phá thư mục build/generated/source/kapt để xem mã Java thực tế mà Hilt đã viết cho bạn.

Related Error Notes