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

问题描述 投票:1回答:1

我实际上早先问了一个类似的问题。我只是试着以一种简单的方式提问。

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

谢谢。

android dagger-2 dagger
1个回答
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注释在单个模块中提供相同的类类型

© www.soinside.com 2019 - 2024. All rights reserved.