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

时间:2019-03-22 04:02:04

标签: android dagger-2 dagger

我实际上早些时候也问过类似的问题。我只是想问一个简单的方法。

我的ActivityBuilder是

@Module
public abstract class ActivityBuilder {
    @ContributesAndroidInjector(modules = {MainActivityModule.class, MainFragmentProvider.class})
    abstract MainActivity contributeMainActivity();
}

我的MainActivity是

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中注入相同的类对象?

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用@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注释在单个模块中提供相同的类类型