使用Dagger Hilt 2.42实现延迟注入时遇绑定缺失错误
解决Dagger Hilt延迟注入Lazy的绑定缺失问题
问题根源
你手动实现了Lazy<ClientInsights>的Provider,但Dagger Hilt在处理泛型注入时,期望的是Lazy<? extends ClientInsights>类型的绑定,同时Dagger本身原生支持Lazy<T>的延迟注入,完全不需要手动创建Lazy实例。
修复步骤
- 修改AppModule中的ClientInsights提供方法,直接返回
ClientInsights实例,而非Lazy<ClientInsights>:
@Singleton @Provides fun provideClientInsights(remoteConfigProvider: RemoteConfigProvider): ClientInsights { return ClientInsights( ApplicationID(BuildConfig.ALGOLIA_APP_ID), APIKey(remoteConfigProvider.keyAlgoliaApiKey) ) }
- 保持AlgoliaAnalyticsProvider的构造函数不变,Dagger会自动把
ClientInsights包装成Lazy<ClientInsights>注入:
class AlgoliaAnalyticsProvider @Inject constructor( private val clientInsights: Lazy<ClientInsights>, private val coroutineDispatcherProvider: CoroutineDispatcherProvider )
- 恢复provideAnalyticsProvider的完整代码,不用再注释
algoliaAnalyticsProvider参数:
@Singleton @Provides fun provideAnalyticsProvider( firebaseAnalyticsProvider: FirebaseAnalyticsProvider, crashlyticsUserPropertiesProvider: CrashlyticsUserPropertiesProvider, caMPAnalyticsProvider: CaMPAnalyticsProvider, algoliaAnalyticsProvider: AlgoliaAnalyticsProvider ) = AnalyticsProvider( listOf( firebaseAnalyticsProvider, crashlyticsUserPropertiesProvider, algoliaAnalyticsProvider ) )
原理直白说
Dagger Hilt内置了对Lazy<T>的支持,只要你能提供T类型的实例,当构造函数里声明Lazy<T>时,Dagger会自动生成延迟初始化的代理对象。你之前手动提供Lazy<T>反而打乱了Dagger的自动绑定逻辑,导致泛型类型不匹配报错。
内容的提问来源于stack exchange,提问作者ant2009
相关产品推荐
相关产品推荐

