根据关于注入活动对象的 Dagger 文档,它说安装AndroidInjectionModule在您的应用程序组件中。然而,没有它一切都很好。
这是否意味着我不需要申报?在什么情况下会出错?
例如:
注入实例
data class Food(val name: String)
Run Code Online (Sandbox Code Playgroud)
模块
@Module
class FoodModule{
@Provides
fun provideFood(): Food {
return Food("cholocate")
}
}
Run Code Online (Sandbox Code Playgroud)
绑定模块
@Module
abstract class MainActivityModule {
@ContributesAndroidInjector(modules = [FoodModule::class])
abstract fun FoodShop(): MainActivity
}
Run Code Online (Sandbox Code Playgroud)
AppComponent(不安装AndroidInjectionModule)
@Component(modules = [MainActivityModule::class])
interface AppComponent{
fun inject(app: App)
}
Run Code Online (Sandbox Code Playgroud)
应用程序
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
}
} …Run Code Online (Sandbox Code Playgroud) 我在https://google.github.io/dagger/multibindings 中使用了示例
模块 A
@Module
object MyModuleA {
@Provides
@IntoSet
fun provideOneString(): String {
return "ABC"
}
}
Run Code Online (Sandbox Code Playgroud)
模块 B
@Module
object MyModuleB {
@Provides
@ElementsIntoSet
fun provideSomeStrings(): Set<String> {
return HashSet<String>(Arrays.asList("DEF", "GHI"))
}
}
Run Code Online (Sandbox Code Playgroud)
成分
@Component(modules = [ MyModuleA::class, MyModuleB::class])
interface MyComponent {
fun strings(): Set<String>
}
Run Code Online (Sandbox Code Playgroud)
测试
@Test
fun testMyComponent() {
val myComponent = DaggerMyComponent.builder().build()
println("${myComponent.strings()}")
}
Run Code Online (Sandbox Code Playgroud)
它显示必须设置 MyModuleA 的错误,但将模块从对象更改为类工作正常。
@Module
class MyModuleA {
@Provides
@IntoSet
fun provideOneString(): String {
return "ABC"
}
}
@Module
class …Run Code Online (Sandbox Code Playgroud)