根据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中成功获得巧克力。
答案 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类的组件中。