【问题标题】:Passing parameters at runtime dagger 2在运行时传递参数 dagger 2
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 2012-05-05
      • 2012-12-10
      • 2018-03-23
      相关资源
      最近更新 更多