【发布时间】:2018-07-26 18:03:28
【问题描述】:
我有一个模块,UserModule,它接受一个字符串并提供一个用户对象。
用户模块:
@Module
class UserModule(val name: String) {
@Provides
fun provideUser() : User = User(name = name)
}
还有一个ViewModelComponent,它的组件之一是UserModule
视图模型组件:
@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 获得的。
我能想到的唯一解决方案是在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 中注入动态参数的唯一方法。有没有更好的方法来实现这一点
【问题讨论】:
标签: java android kotlin dagger-2