You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向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可管理的依赖,而非通过模块构造函数传递:

  1. 添加限定符区分基础类型依赖
    由于Boolean是基础类型,需要用限定符标记避免依赖混淆:

    @Qualifier
    @Retention(RetentionPolicy.RUNTIME)
    public @interface CustomBoolean {}
    
  2. 改造遗留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);
        }
    }
    
  3. 为另一模块添加Hilt组件注解
    给AnotherDaggerModule加上@InstallIn,让Hilt管理其生命周期:

    @Module
    @InstallIn(SingletonComponent.class)
    public class AnotherDaggerModule {    
    
        @Provides 
        @Singleton
        AnotherClassDepndsOnCustomClass provideAnotherClass(CustomClass customClass) {
            return new AnotherClassDepndsOnCustomClass(customClass);
        }
    }
    
  4. 验证HiltViewModel注入
    原HiltViewModel代码无需修改,Hilt会自动通过改造后的模块获取AnotherClassDepndsOnCustomClass实例。

若customBoolean需运行时动态传入(如启动参数),可结合Hilt的EntryPoint或自定义ViewModelProvider.Factory实现,上述方案适用于参数固定或可通过全局逻辑获取的场景。

内容的提问来源于stack exchange,提问作者vbp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 08:30:37