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