Внедрить тот же класс объекта в деятельности и фрагмент с Dagger 2 - PullRequest
1 голос
/ 22 марта 2019

Я действительно задавал подобный вопрос ранее. Я просто попытался спросить простым способом.

Мой 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";
    }*/
}

Мой FragmentProvider есть,

@Module
public abstract class MainFragmentProvider {
    @ContributesAndroidInjector(modules = MainFragmentModule.class)
    abstract MainFragment provideMainFragmentFactory();
}

Теперь я не могу вставить строку как в активность, так и во фрагмент одновременно. Это работает по одному. Можно ли раскомментировать код в FragmentModule и Fragment, чтобы внедрить один и тот же объект класса в действие и фрагмент?

Спасибо.

1 Ответ

0 голосов
/ 22 марта 2019

Вы можете внедрить те же типы классов, используя аннотацию @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, прочитайте, это поможет вам разобраться с Кинжалом 2 и понять больше

Edit: Вы можете предоставить один и тот же тип класса в пределах одного модуля, используя аннотацию @Named

...