没有开往 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
页面末尾有更多教程和代码实验室。
我在 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
页面末尾有更多教程和代码实验室。