我实际上早先问了一个类似的问题。我只是试着以一种简单的方式提问。
我的ActivityBuilder是,
@Module
public abstract class ActivityBuilder {
@ContributesAndroidInjector(modules = {MainActivityModule.class, MainFragmentProvider.class})
abstract MainActivity contributeMainActivity();
}
我的主要活动是,
class MainActivity : DaggerAppCompatActivity() {
@Inject
lateinit var injectedString:String
}
我的片段是,
class MainFragment : DaggerFragment() {
/*@Inject
lateinit var injectedString:String*/
}
我的ActivityModule是,
@Module
public class MainActivityModule {
@Provides
static String provideDummyDependency() {
return "I love Dagger";
}
}
我的FragmentModule是,
@Module
public class MainFragmentModule {
/*@Provides
static String provideDummyDependency() {
return "I love Dagger";
}*/
}
我的FragmentProvider是,
@Module
public abstract class MainFragmentProvider {
@ContributesAndroidInjector(modules = MainFragmentModule.class)
abstract MainFragment provideMainFragmentFactory();
}
现在,我不能同时在活动和片段中注入字符串。它一次只能工作一个。是否有可能取消注释FragmentModule和Fragment中的代码以在activity和fragment中注入相同的类对象?
谢谢。
您可以使用@Named注释注入相同的类类型,例如,在您的情况下,
@Module
public class MainActivityModule {
@Provides @Named("activity")
static String provideActivityString() {
return "I love Dagger from Activity";
}
}
@Module
public class MainFragmentModule {
@Provides @Named("fragment")
static String provideFragmentString() {
return "I love Dagger from fragment";
}
}
并在注射时
你可以注射为
@Inject @Named("activity") String activityString;//Will be "I love Dagger from Activity"
@Inject @Named("fragment") String fragmentString;//Will be "I love Dagger from fragment"
您可以使用任何名称字符串,以上名称仅用于说明目的
通过https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2查看,阅读它会帮助您处理Dagger 2并了解更多
编辑:您也可以使用@Named注释在单个模块中提供相同的类类型