“dagger-android”库,如何注入Dialog类的属性?

时间:2018-04-25 11:11:39

标签: android kotlin dagger

我遵循的例子声称这是更好的“新方式”。 (https://proandroiddev.com/exploring-the-new-dagger-android-module-9eb6075f1a46)完整的示例源代码在这里(https://github.com/jshvarts/DaggerAndroidKotlinSampleApp)。它使用它来向这样的Activity注入属性,

class MainActivity:AppCompatActivity()
{
    @Inject
    lateinit var something:Something

    override fun onCreate(..)
    {
      AndroidInjection.inject(this)
      ...

一个模块

@Module
abstract class ActivitiesModule
{
    @ContributesAndroidInjector
    abstract fun bindMainActivity():MainActivity

效果很好,但是自定义Dialog类呢?我使用一些自定义参数创建Dialog(仅在运行时使用用户的输入),如下所示。我可以修改MyDialog的构造函数来取something,然后让活动最终将something传递给MyDialog的构造函数。

但它会很难看,因为活动并没有直接创建MyDialog。 MainActivity具有自定义控件,当单击按钮时,该自定义控件会显示MyDialog。因此,要使用构造函数方法,我必须将something从MainActivity传递到自定义控件,然后让自定义控件使用something创建MyDialog。

class MyDialog:Dialog
{
      @Inject
      lateinit var something:Something

      constructor(context:Context?, arg1, args2, args3):super(context)
      {
          //Cannot call AndroidInjection.inject, because
          //it does not take a Dialog.
          AndroidInjection.inject(this); //<--Does NOT work.

如果我能告诉Dagger在其构造函数中注入MyDialog的字段......对此有什么解决方法?

1 个答案:

答案 0 :(得分:0)

AndroidInjection仅适用于活动和片段等类,而不适用于对话框。如果要注入对话框,请改用对话框片段。或者,因为您实际上只能调用构造函数,所以使用构造函数注入而不是Dagger。