2017-02-18 12 views
1

Я только начал работать с кинжалом 2. Я создал график зависимостей для зависимости уровня приложения. Теперь, когда я хотел создать зависимость, которая требуется для определенного действия, поэтому я создал еще один Component для активности, тогда я создал модуль и область действия для этого компонента. Теперь, когда я закончил писать весь код, я строю проект, но я получаю ошибку компилятора, которую я не могу решить.Кинжал 2, Как добавить интерфейс в зависимость

Вот что я делаю.

@FeedsCatalogActivityScope 
@Component(modules = FeedsCatalogActivityModule.class, dependencies = FeederApplicationComponent.class) 

//My activity requires Catalog adapter so i am creating dependency for that 
public interface FeedsCatalogActivityComponent { 
    CatalogAdapter getCatalogAdapter(); 
} 

Вот модуль

@Module 
public class FeedsCatalogActivityModule { 

    private final SelectedInterfaceListener selectedInterfaceListener; 

    public FeedsCatalogActivityModule(SelectedInterfaceListener selectedInterfaceListener) { 
     this.selectedInterfaceListener = selectedInterfaceListener; 
    } 

    @Provides 
    @FeedsCatalogActivityScope 
    public CatalogAdapter catalogAdapter(Picasso picasso, SelectedInterfaceListener mSelectesInterfaceListener) { 
     return new CatalogAdapter(picasso, mSelectesInterfaceListener); 
    } 

} 

Здесь сфера

@Scope 
public @interface FeedsCatalogActivityScope { 
} 

Так что теперь, когда я построить я получаю эту ошибку

/Users/Zeeshan/Desktop/personal/Feeder/app/src/main/java/io/droidninja/feeder/FeederApplication.java Error:(10, 31) error: cannot find symbol class DaggerFeederApplicationComponent /Users/Zeeshan/Desktop/personal/Feeder/app/src/main/java/io/droidninja/feeder/ui/activities/FeedsCatalogActivityComponent.java Error:(13, 20) error: io.droidninja.feeder.ui.adapters.SelectedInterfaceListener cannot be provided without an @Provides-annotated method. io.droidninja.feeder.ui.adapters.SelectedInterfaceListener is injected at io.droidninja.feeder.ui.activities.FeedsCatalogActivityModule.catalogAdapter(…, mSelectesInterfaceListener) io.droidninja.feeder.ui.adapters.CatalogAdapter is provided at io.droidninja.feeder.ui.activities.FeedsCatalogActivityComponent.getCatalogAdapter() Error:Execution failed for task ':app:compileDebugJavaWithJavac'. Compilation failed; see the compiler error output for details.

Что я понимаю это что у меня проблема в FeedsCatalogActivityModule. Как я могу предоставить SelectedInterfaceListener? Это интерфейс.

P.S Я новичок в dagger2, я только начинаю с этого.

ответ

0

В соответствии с вашим кодом, вы предположим передать экземпляр SelectedInterfaceListener в FeedsCatalogActivityModule когда вы здание FeedsCatalogActivityComponent внутри действия, которая его использует.

в своей деятельности создать метод, настроить компонент, как этот

private void initializeInjector() { 
    FeedsCatalogActivityComponent feedsCatalogActivityComponent = DaggerFeedsCatalogActivityComponent.builder() 
      .feederApplicationComponent(feederApplicationComponent()/* create this method and it should return a correctly built FeederApplicationComponent */) 
      .feedsCatalogActivityModule(
       new FeedsCatalogActivityModule(
        new SelectedInterfaceListener() 
        /* pass in the instance of SelectedInterfaceListener here */) 
       ).build(); 
} 

И то не забудьте изменить модуль обеспечивает метод

@Provides 
@FeedsCatalogActivityScope 
public CatalogAdapter catalogAdapter(Picasso picassor) { 
    return new CatalogAdapter(picasso, this.selectedInterfaceListener); 
} 
0

Ну, вы должны каким-то образом обеспечить реализацию для этого интерфейса. Посмотрите на:

Пример

@Binds 
abstract SelectedInterfaceListener provideDsListPresenter(SelectedInterfaceListenerImpl impl); 
+0

Деятельность, реализует этот интерфейс. Что я должен делать в этом случае? –

+0

https://guides.codepath.com/android/Dependency-Injection-with-Dagger-2#dependent-components-vs-subcomponents – TmTron

+0

@ ZeeshanShabbir интересно, почему вы хотели бы, чтобы это было реализовано Activity, так или иначе, ответьте и передайте 'this' как ссылку в конструкторе модуля при построении компонента. – Distjoy