gpt4 book ai didi

android - 如果没有 @Inject 构造函数或 @Provides 注释方法,则无法提供 Dagger 类

转载 作者:行者123 更新时间:2023-11-30 05:03:14 25 4
gpt4 key购买 nike

你好,我是 Dagger 的新手,我创建了一个简单的项目来了解更多信息。我有一个 PermissionManager 类,它具有作为构造函数参数的 Activity

  class PermissionManager(activity: MainActivity) {

}

我的 MainFragment 依赖于它。所以我创建了 BindingModule

@Module
interface BindingModule {

@DaggerScope(MainActivity::class)
@ContributesAndroidInjector(modules = [MainActivityModule::class])
fun provideMainActivity(): MainActivity

@FragmentScope
@ContributesAndroidInjector(modules = [MainFragmentModule::class])
fun provideMainFragment(): MainFragment
}

这是我的 MainActivityModule 提供 PermissionManager

@Module
abstract class MainActivityModule private constructor() {

@Module
companion object {
@Provides
@JvmStatic
fun providePermissionManager(activity: MainActivity): PermissionManager = PermissionManager(activity)
}
}

这是我的 MainFragmentModule,它必须使用在我的 MainActivityModule 中创建的 PermissionManager

@Module
abstract class MainFragmentModule private constructor() {

@Module
companion object {

@JvmStatic
@Provides
@IntoMap
@ViewModelKey(MyTestViewModel::class)
fun provideModelFactory(
permissionManager: PermissionManager
): ViewModel = MyTestViewModel(permissionManager)
}
}

这是我得到的

com\nav\component\di\AppComponent.java:12: error: [Dagger/MissingBinding] com.nav.component.utils.PermissionManager cannot be provided without an @Inject constructor or an @Provides-annotated method.
public abstract interface AppComponent extends dagger.android.AndroidInjector<com.nav.component.MyTestDaggerApp>

所以首先我不明白为什么我不能在我的 fragment 中使用为activity创建的依赖项?有什么解决办法吗?

编辑:

绑定(bind)模块的使用方法如下

@AppScope
@Component(
modules = [
AndroidSupportInjectionModule::class,
AppModule::class,
BindingModule::class,
NetworkingModule::class
]
)
interface AppComponent : AndroidInjector<MyTestDaggerApp> {

/**
* AppComponent Builder interface. All implementation part is handled by a dagger compiler.
*/
@Component.Factory
interface Factory : AndroidInjector.Factory<MyTestDaggerApp>
}

最佳答案

使您的 fragment 成为 BindingModule 的子组件以从中获取绑定(bind)。不要忘记让 MainActivity 实现 HasAndroidInjector(如果它还没有的话)。

@Module
interface BindingModule {

@DaggerScope(MainActivity::class)
@ContributesAndroidInjector(modules = [MainActivityModule::class, MainFragmentBindingModule::class])
fun provideMainActivity(): MainActivity
}

@Module
interface MainFragmentBindingModule {

@FragmentScope
@ContributesAndroidInjector(modules = [MainFragmentModule::class])
fun provideMainFragment(): MainFragment
}

关于android - 如果没有 @Inject 构造函数或 @Provides 注释方法,则无法提供 Dagger 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57841865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com