代码之家  ›  专栏  ›  技术社区  ›  David

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

  •  0
  • David  · 技术社区  · 5 年前

    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 许可证管理器

    @Module
    abstract class MainActivityModule private constructor() {
    
        @Module
        companion object {
            @Provides
            @JvmStatic
            fun providePermissionManager(activity: MainActivity): PermissionManager = PermissionManager(activity)
        }
    }
    

    MainFragmentModule 必须使用 是在我的生活中创造的 主活动模块

    @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>
    }
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   mauryat    5 年前

    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
    }