为什么没有安装AndroidInjectionModule它仍然有效?

时间:2018-01-07 04:14:30

标签: dagger-2

根据Dagger documentation about injecting activity objects,它表示在您的应用程序组件中安装AndroidInjectionModule。但是,没有它,一切都很好。

这是否意味着我不需要声明它?在什么情况下会出错?

例如:
注入的实例

data class Food(val name: String)

模块

@Module
class FoodModule{
    @Provides
    fun provideFood(): Food {
        return Food("cholocate")
    }
}

BindingModule

@Module
abstract class MainActivityModule {
    @ContributesAndroidInjector(modules = [FoodModule::class])
    abstract fun FoodShop(): MainActivity
}

AppComponent(不安装AndroidInjectionModule)

@Component(modules = [MainActivityModule::class])
interface AppComponent{
    fun inject(app: App)
}

应用

class App : Application(), HasActivityInjector {
    @Inject
    lateinit var dispatchingActivityInjector: DispatchingAndroidInjector<Activity>

    override fun onCreate() {
        super.onCreate()
        DaggerAppComponent.create().inject(this)
    }

    override fun activityInjector(): AndroidInjector<Activity> {
        return dispatchingActivityInjector
    }
}

MainActivity

class MainActivity : AppCompatActivity() {

    @Inject
    lateinit var food: Food

    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.d("test", "Get ${food.name}")
    }
}

它在MainActivity中成功获得巧克力。

1 个答案:

答案 0 :(得分:3)

  

这是否意味着我不需要声明它?在什么情况下会出错?

实际上,您似乎不需要声明它,但如果不这样做,可能会导致编译错误。

如果查看AndroidInjectionModule,您可以看到它只列出了一堆用于框架类型的@Multibinds方法。

@Multibinds
abstract Map<Class<? extends Activity>, AndroidInjector.Factory<? extends Activity>>
    activityInjectorFactories();

现在,如果您查找Declaring @Multibinds,可以阅读

  

对于至少有一个@Multibinds@IntoSet@ElementsIntoSet绑定的集合或地图,您不必使用@IntoMap,但您必须声明它们如果他们可能是空的。

如果它们可能为空,声明它们正是AndroidInjectionModule模块正在为你做的事情。如果Android注入部件需要未定义的注入工厂Map,则可能会收到编译时错误,指出无法提供。

您不需要该模块的原因是因为您正在使用@ContributesAndroidInjector生成的代码将包含@Binds @IntoMap etc.方法,该方法声明了绑定映射。上面说明 - 因为它不再是空的 - 你不需要@Multibinds为非空多重绑定提供的额外AndroidInjectionModule声明。

您可能不会需要模块,但它会为您声明所有框架注入工厂,以防它们可能为空,可能会阻止一个或两个编译错误。毕竟javadoc只是表明要安装should,而不是必须

  

此模块应安装在用于注入Application类的组件中。