Android 使用匕首2在活动和片段中注入相同的类对象

Android 使用匕首2在活动和片段中注入相同的类对象,android,dagger-2,dagger,Android,Dagger 2,Dagger,我之前也问过类似的问题。我只是试着用一种简单的方式问 我的ActivityBuilder是 @Module public abstract class ActivityBuilder { @ContributesAndroidInjector(modules = {MainActivityModule.class, MainFragmentProvider.class}) abstract MainActivity contributeMainActivity(); } 我的主

我之前也问过类似的问题。我只是试着用一种简单的方式问

我的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*/
}
我的活动模块是

@Module
public class MainActivityModule {
    @Provides
    static String provideDummyDependency() {
        return "I love Dagger";
    }
}
@Module
public class MainFragmentModule {
    /*@Provides
    static String provideDummyDependency() {
        return "I love Dagger";
    }*/
}
我的模块是

@Module
public class MainActivityModule {
    @Provides
    static String provideDummyDependency() {
        return "I love Dagger";
    }
}
@Module
public class MainFragmentModule {
    /*@Provides
    static String provideDummyDependency() {
        return "I love Dagger";
    }*/
}
我的碎片提供者是

@Module
public abstract class MainFragmentProvider {
    @ContributesAndroidInjector(modules = MainFragmentModule.class)
    abstract MainFragment provideMainFragmentFactory();
}
现在,我不能同时在activity和fragment中注入字符串。它一次只能工作一个。是否可以取消对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"
您可以使用任何名称字符串,以上名称仅用于说明

通读一遍,它将帮助你处理匕首2并理解更多

编辑:
您也可以在单个模块中提供相同的类类型,使用@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"
您可以使用任何名称字符串,以上名称仅用于说明

通读一遍,它将帮助你处理匕首2并理解更多

编辑:
您也可以在单个模块中提供相同的类类型,使用@Named注释

您可以将其注入到多个类中,但不能在多个位置提供它。您似乎不理解模块是什么-您没有为每个要注入的类创建一个模块。您希望为注释提供感谢的每组变量创建一个模块。这是否意味着“@ContributesAndroidInjector(modules={MainActivityModule.class,MainFragmentProvider.class})”是一个组,我可以在其中的一个位置进行注入?在这种情况下,我可以用一个片段模块创建另一个模块吗?您可以将它注入到多个类中,但不能在多个地方提供它。您似乎不理解模块是什么-您没有为每个要注入的类创建一个模块。您希望为注释提供感谢的每组变量创建一个模块。这是否意味着“@ContributesAndroidInjector(modules={MainActivityModule.class,MainFragmentProvider.class})”是一个组,我可以在其中的一个位置进行注入?在这种情况下,我可以用一个模块碎片制作另一个模块吗?谢谢你的回答。我想做的是,我将为viewmodel提供一个factory builder。所以,如果我想把工厂注入到框架和活动中,我必须做什么?如果您有时间,请查看本回购协议中的反馈活动。谢谢你的回答。我想做的是,我将为viewmodel提供一个factory builder。所以,如果我想把工厂注入到框架和活动中,我必须做什么?如果您有时间,请查看本回购协议中的反馈活动。