gpt4 book ai didi

java - 在运行时传递参数 Dagger 2

转载 作者:太空狗 更新时间:2023-10-29 14:38:51 25 4
gpt4 key购买 nike

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

用户模块:

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

还有一个 ViewModelComponent,它的组件之一是 UserModule

View 模型组件:

@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 ”的解决方案,也没有尝试过,但你可以从它开始。

我只会对此发表评论,但我不需要声誉...

关于java - 在运行时传递参数 Dagger 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51545012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com