为什么不安装 AndroidInjectionModule 仍然有效?

Mum*_*umi 5 dagger-2

根据关于注入活动对象的 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 中成功获取巧克力。

Dav*_*jak 4

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

实际上看起来你不需要声明它,但如果不声明它可能会导致编译错误。


如果您查看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 类的组件中。