根据关于注入活动对象的 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)
主要活动
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}")
}
}
Run Code Online (Sandbox Code Playgroud)
它在 MainActivity 中成功获取巧克力。
这是否意味着我不需要声明?什么情况下会出错呢?
实际上看起来你不需要声明它,但如果不声明它可能会导致编译错误。
如果您查看AndroidInjectionModule,您会发现它只是列出了一堆@Multibinds框架类型的方法。
@Multibinds
abstract Map<Class<? extends Activity>, AndroidInjector.Factory<? extends Activity>>
activityInjectorFactories();
Run Code Online (Sandbox Code Playgroud)
现在如果你查找声明@Multibinds你可以读到
您不必使用
@Multibinds至少具有一个@IntoSet、@ElementsIntoSet、 或@IntoMap绑定的集合或映射,但如果它们可能为空,则必须声明它们。
如果它们可能为空,则声明它们正是该AndroidInjectionModule模块为您所做的事情。如果 Android 注入部分需要未定义的注入器工厂映射,您可能会收到编译时错误,指出无法提供它。
您不需要该模块的原因是因为您正在使用@ContributesAndroidInjector,其中生成的代码将包含一个@Binds @IntoMap etc.声明绑定映射的方法。如上所述,因为它不再是空的,所以您不需要提供非空多重绑定的附加@Multibinds声明。AndroidInjectionModule
您可能不需要该模块,但它会为您声明所有框架注入器工厂,以防它们可能为空,从而可能防止一两个编译错误。毕竟 javadoc 只是声明应该安装它,而不是必须安装。
该模块应安装在用于注入 Application 类的组件中。
| 归档时间: |
|
| 查看次数: |
709 次 |
| 最近记录: |