在运行时匕首2传递参数

时间:2018-07-26 18:03:29

标签: java android kotlin dagger-2

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

UserModule:

@Module
class UserModule(val name: String) {
    @Provides
    fun provideUser() : User = User(name = name)
}

还有一个ViewModelComponent作为其组成部分之一的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

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

        (application as MainApplication).component.inject(this)
}

但是,这假定UserModule name的值在运行时是已知的并且被硬编码到MainApplication中,但是,实际上,name的值是从MainActivity获得的。 / p>

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

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中注入动态参数的唯一方法。有没有更好的方法来实现此目的

1 个答案:

答案 0 :(得分:0)

我也碰到了这个问题,我想到的第一个解决方案是创建一个“静态持有人”类,该类可以保存动态参数,开发人员有责任在正确的时间(在注入发生之前)更新此持有人。猜测。我实际上并没有尝试过,而且看起来也不是很干净。

经过一番谷歌搜索之后,我发现了这篇文章:https://proandroiddev.com/dagger-2-module-parameters-7c820d944a似乎更像是“面向匕首”的解决方案,也没有尝试过,但是您可以从这里开始。

我只会对此发表评论,但我并没有要求的声誉...