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


这是我提供MainActivityModulePermissionManager

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

最佳答案

使片段成为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
}

10-08 16:43