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

时间:2019-09-08 12:14:29

标签: android dagger-2

您好,我是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
}

这是我的MainActivityModule,提供PermissionManager

@Module
abstract class MainActivityModule private constructor() {

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

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

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

首先,我不明白为什么不能在activity中使用为fragment创建的依赖项吗?有什么想法可以解决这个问题吗?

编辑:

这是绑定模块的使用方式

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

1 个答案:

答案 0 :(得分:0)

将片段设为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
}