没有开往 Class<com.example.fitternitytest.view.fragment.home.tabs.WorkoutInStudioFragment> 的喷油器工厂

No injector factory bound for Class<com.example.fitternitytest.view.fragment.home.tabs.WorkoutInStudioFragment>

我在 HomeFragment 中创建了一个选项卡布局(WorkoutAtHome 和 Workoutinstudio),显然我使用了片段来创建选项卡布局。现在我想在 tablayout 片段中注入 ViewModelProviderFactory 对象。因此,为此我所做的是添加带有 @ContributesAndroidInjector 的 home 片段,并且两个 tablayout 片段都在 homeFragment 模块中。下面是代码。

ActivityBuilderModule

@Module
abstract class ActivityBuilderModule {


    @ContributesAndroidInjector(
        modules = [
            FragmentBuilderModule::class
        ]
    )
    abstract fun contributeMainActivity(): MainActivity

} 

FragmentBuilderModule

@Module
interface FragmentBuilderModule {
    @ContributesAndroidInjector
    fun contributeSplashFragment(): SplashFragment

    @HomeScope
    @ContributesAndroidInjector(
        modules = [
            TabBuilderModule::class,
            HomeViewModelModule::class,
            HomeModule::class]
    )
    fun contributeHomeFragment(): HomeFragment

    @LocationScope
    @ContributesAndroidInjector(
        modules = [
            LocationModule::class
        ]
    )
    fun contributeLocationFragment(): LocationFragment


}

TabBuilderModule

@Module
interface TabBuilderModule {

    @ContributesAndroidInjector
    fun contributeWorkoutInStudio(): WorkoutInStudioFragment


    @ContributesAndroidInjector
    fun contributeWorkoutAtHomeFragment(): WorkoutAtHomeFragment

}

现在的问题是,每当我想在 tablayout 片段中注入任何内容时,我都会收到错误提示 No injector factory bound for Class<com.example.fitternitytest.view.fragment.home.tabs.WorkoutInStudioFragment>

WorkoutAtHome片段

class WorkoutAtHomeFragment :DaggerFragment() , HasSupportFragmentInjector {
    private var count = 0

    @Inject
    lateinit var factory: ViewModelProviderFactory

    private val viewModel: HomeViewModel by activityViewModels { factory }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
}

同样的代码也适用于其他片段。

首先 HasFragmentInjector 是由 DaggerFragment 实现的 - 你为什么又要这样做?

class WorkoutAtHomeFragment :DaggerFragment() , HasSupportFragmentInjector {

其次 - 您缺少 WorkoutInStudioFragment 的注入器工厂,错误可见,但您已经显示了 WorkoutAt[=33= 的代码]主页片段

第三 - 这不是使用 Dagger 的方式了。 您应该使用 Hilt,这意味着您不再需要像 @ContributesAndroidInjector

这样的东西

你只会说:

@AndroidEntryPoint
class WorkoutAtHomeFragment : Fragment() {
    ...
}

Hilt 教程https://developer.android.com/training/dependency-injection/hilt-android

页面末尾有更多教程和代码实验室。