我有一个模块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()
}
}
并在我的 Activity 中像这样引用它:
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
获得的。我能想到的唯一解决方案是在
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中注入(inject)动态参数的唯一方法。是否有更好的方法可以实现这一点
最佳答案
我也碰到了这个问题,我想到的第一个解决方案是创建一个将保存动态参数的“静态持有人”类,开发人员有责任在正确的时间(在注入(inject)发生之前)更新此持有人。我实际上并没有尝试过,而且看起来也不是很干净。
经过一番谷歌搜索之后,我找到了这篇文章:https://proandroiddev.com/dagger-2-module-parameters-7c820d944a似乎更“面向 Dagger ”解决方案,也没有尝试过,但是您可以从这里开始。
我只会对此发表评论,但我并不需要声誉。