你好,我是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
}
这是我提供PermissionManager
的MainActivityModule
@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
}