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



你好,我是Dagger新手,我已经完成了一个简单的项目来了解更多信息。我有一个类PermissionManager将活动作为构造函数参数

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
}

这是我提供PermissionManagerMainActivityModule

@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)
}
}

这就是我得到的

comnavcomponentdiAppComponent.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创建的依赖项?有什么想法可以解决这个问题吗?

编辑:

以下是绑定模块的使用方式

@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>
}

使片段成为BindingModule的子组件,以便从中获取绑定。不要忘记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
}

最新更新