我有一个
FooViewModel
,其范围为 FooFragment
。在 FooFragment
中,设备类型是根据用户选择从另一个片段传递的。我想将其注入到 FooViewModel
的构造函数中。我应该如何在模块中提供deviceType
?
这是我的设置 -
@Module
interface FooModule {
@ContributesAndroidInjector
fun contributesFooFragment(): FooFragment
companion object {
@Provides
fun provideDeviceType(fragment: FooFragment) = fragment.deviceType
}
}
我收到错误
[Dagger/MissingBinding] FooFragment cannot be provided without an @Inject constructor or an @Provides-annotated method. This type supports members injection but cannot be implicitly provided.
...
错误消息表明 Dagger 无法提供 FooFragment 的实例,因为它没有 @Inject 构造函数或返回 FooFragment 实例的 @Provides 注释方法。
问题是您尝试使用 @ContributesAndroidInjector 将 FooFragment 贡献给 Android 注入器,但您没有为 Dagger 提供创建 FooFragment 实例的方法。
要解决此问题,您需要为 Dagger 提供一种创建 Foo Fragment 实例的方法。实现此目的的一种方法是添加 @Inject 构造函数
类 FooFragment @Inject 构造函数() : Fragment() {
}
通过添加 @Inject 构造函数,您可以告诉 Dagger 它可以使用此构造函数创建 FooFragment 的实例。
或者,您可以提供一个带有 @Provides 注释的方法,该方法返回 FooFragment 的实例
@模块 接口 FooModule {
@ContributesAndroidInjector
fun contributesFooFragment(): FooFragment
companion object {
@Provides
fun provideFooFragment(fragmentManager: FragmentManager): FooFragment{
return FooFragment()
}
}
}
在此示例中,provideFooFragment 方法使用 FragmentManager 提供 FooFragment 的实例。
添加这些解决方案之一后,Dagger 应该能够提供 FooFragment 的实例,并且错误应该得到解决。