使用 dagger2 将片段的数据注入到视图模型中

问题描述 投票:0回答:1

我有一个

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.
...
android dagger-2
1个回答
0
投票

错误消息表明 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 的实例,并且错误应该得到解决。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.