如何向Hilt注入带非空构造函数的Dagger模块依赖?
如何在Hilt中注入带非空构造函数的遗留Dagger模块?
Hilt不支持带非空构造函数的Module,从Dagger迁移到Hilt时,若要将这类遗留模块的依赖注入到HiltViewModel等组件中,会遇到DaggerModule must be set的报错,且无法通过组件初始化时传递自定义参数。以下是解决方法:
遗留Dagger模块代码
// Legacy Dagger module @Module public class DaggerModule { private final Boolean customBoolean; DaggerModule(Boolean customBoolean) { this.customBoolean = customBoolean; } @Provides @Singleton CustomClass provideCustomClass() { return new CustomClass(customBoolean); } } @Module public class AnotherDaggerModule { @Provides @Singleton AnotherClassDepndsOnCustomClass provideAnotherClass(CustomClass customClass) { return new AnotherClassDepndsOnCustomClass(customClass); } }
已迁移的Hilt代码
// Migrated Hilt module @HiltViewModel class HiltViewModel @Inject constructor( private val anotherClass: AnotherClassDepndsOnCustomClass ) : ViewModel() { ... }
解决方案
核心思路是将遗留模块的构造参数转为Hilt可管理的依赖,而非通过模块构造函数传递:
添加限定符区分基础类型依赖
由于Boolean是基础类型,需要用限定符标记避免依赖混淆:@Qualifier @Retention(RetentionPolicy.RUNTIME) public @interface CustomBoolean {}改造遗留DaggerModule
移除带参数的构造函数,改用@Provides提供构造参数和目标类:@Module @InstallIn(SingletonComponent.class) public class DaggerModule { @Provides @Singleton @CustomBoolean Boolean provideCustomBoolean() { // 替换为实际获取自定义Boolean值的逻辑(如全局配置、SharedPreferences) return true; } @Provides @Singleton CustomClass provideCustomClass(@CustomBoolean Boolean customBoolean) { return new CustomClass(customBoolean); } }为另一模块添加Hilt组件注解
给AnotherDaggerModule加上@InstallIn,让Hilt管理其生命周期:@Module @InstallIn(SingletonComponent.class) public class AnotherDaggerModule { @Provides @Singleton AnotherClassDepndsOnCustomClass provideAnotherClass(CustomClass customClass) { return new AnotherClassDepndsOnCustomClass(customClass); } }验证HiltViewModel注入
原HiltViewModel代码无需修改,Hilt会自动通过改造后的模块获取AnotherClassDepndsOnCustomClass实例。
若customBoolean需运行时动态传入(如启动参数),可结合Hilt的EntryPoint或自定义ViewModelProvider.Factory实现,上述方案适用于参数固定或可通过全局逻辑获取的场景。
内容的提问来源于stack exchange,提问作者vbp
相关产品推荐
相关产品推荐

