为什么 Dagger 无法识别 AppModule 中的@Provides?

why Dagger could not recognize @Provides in AppModule?

我收到此错误:

[Dagger/MissingBinding] SessionFetcher cannot be provided without an @Inject constructor or an @Provides-annotated method. while you can see I have defined SessionFetcher

在 AppModule 中 class


@Suppress("unused")
@Module
abstract class ViewModelModule {
  @Binds
  @IntoMap
  @ViewModelKey(AccountViewModel::class)
  abstract fun bindAccountViewModel(accountViewModel: AccountViewModel): ViewModel

  @Binds
  abstract fun bindViewModelFactory(factory: ViewModelProviderFactory): ViewModelProvider.Factory
}

@Module(includes = [ViewModelModule::class])
class AppModule(private val applicationContext: Context) {

  @Provides
  fun sessionFetcher(@Named("UserPreferences") userPreferences: SharedPreferences): ISessionFetcher {
    return SessionFetcher(userPreferences)
  }

  @Singleton
  @Provides
  @Named("UserPreferences")
  fun userPreferences(context: Context): SharedPreferences {
    return context.getSharedPreferences(USER_CONFIG_NAME, Context.MODE_PRIVATE)
  }



class AccountViewModel @Inject constructor(sessionFetcher: SessionFetcher) :
    SessionViewModel(sessionFetcher), AppComponent.Injectable {

您在图表中提供 ISessionFetcher,但您正在尝试 inject SessionFetcher.

的实例

您向图表提供的是您可以注入的类型。 Dagger 不分析 @Providing 函数体(或最终实现 class 的类型)。


只需注入接口而不是实现 class。

class AccountViewModel @Inject constructor(sessionFetcher: ISessionFetcher) :
    SessionViewModel(sessionFetcher), AppComponent.Injectable {
    //...
}

如果您需要使用 ISessionFetcher 未公开的 SessionFetcher 方法,那么您的 ISessionFetcher 可能 不完整。