Java 在运行时传递参数dagger 2

Java 在运行时传递参数dagger 2,java,android,kotlin,dagger-2,Java,Android,Kotlin,Dagger 2,我有一个模块,UserModule,它接收字符串并提供用户对象 用户模块: @Module class UserModule(val name: String) { @Provides fun provideUser() : User = User(name = name) } 以及一个viewmodel组件,其中包含UserModule ViewModelComponent: @Singleton @Component(modules = [UserModule::class

我有一个模块,
UserModule
,它接收字符串并提供用户对象

用户模块:

@Module
class UserModule(val name: String) {
    @Provides
    fun provideUser() : User = User(name = name)
}
以及一个
viewmodel组件
,其中包含
UserModule

ViewModelComponent:

@Singleton
@Component(modules = [UserModule::class])
interface ViewModelComponent {
    fun inject(activity: MainActivity)
}
通常,我会在我的应用程序中提供如下组件:

class MainApplication : Application() {

    lateinit var component: AppComponent

    override fun onCreate() {
        super.onCreate()
        component = DaggerAppComponent.builder()
                    .userModule(UserModule("Name"))
                    .build()
    }
}
class MainActivity : AppCompatActivity() {

    @Inject lateinit var user: User

    val newUserName = "NewName"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        component = DaggerAppComponent.builder()
                    .userModule(UserModule(newUserName))
                    .build()    
        component.inject(this)
}
并在我的活动中引用它,如下所示:

class MainActivity : AppCompatActivity() {

    @Inject lateinit var user: User

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        (application as MainApplication).component.inject(this)
}
但是,这假设
UserModule
name的值在运行时已知,并硬编码到
main应用程序中
,然而,实际上,name的值是从
MainActivity
获得的

我能想到的唯一解决方案是在
MainActivity
中构建依赖关系图,因此我可以这样传递名称:

class MainApplication : Application() {

    lateinit var component: AppComponent

    override fun onCreate() {
        super.onCreate()
        component = DaggerAppComponent.builder()
                    .userModule(UserModule("Name"))
                    .build()
    }
}
class MainActivity : AppCompatActivity() {

    @Inject lateinit var user: User

    val newUserName = "NewName"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        component = DaggerAppComponent.builder()
                    .userModule(UserModule(newUserName))
                    .build()    
        component.inject(this)
}

这个解决方案似乎效率很低,但这是我在Dagger 2中注入动态参数的唯一方法。有没有更好的方法来实现这一点呢?

我也遇到了这个问题,我想到的第一个解决方案是创建一些“静态holder”类来保存动态参数,开发人员有责任在正确的时间更新这个holder——我想在注入发生之前。我没有试过,而且看起来也不太干净

在谷歌搜索了一段时间后,我发现了这篇文章:哪一篇看起来更像是“匕首导向”的解决方案,我也没有尝试过,但这是你可以开始的

我只想评论这一点,但我没有要求的声誉