Dagger2: не может быть предоставлен без конструктора @Inject или из метода @Provides-annotated

#android #dagger-2

#Android #кинжал-2

Вопрос:

Я использую Android Dagger2, но я получаю сообщение об ошибке ниже.

Мой класс модуля:

 @Module
public class ApplicationModule {
    private final App mApp;

    public ApplicationModule(App app) {
        this.mApp = app;
    }

    @Provides
    @Singleton
    @ContextType("Application")
    App provideApplicationContext(){
        return mApp;
    }

    @Provides
    @Singleton
    P2PService provideP2PService(App context){
        return new P2PService(context);
    }
}
  

Мой класс компонента:

 @Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
    @ContextType("Application")
    App getContext();

    P2PService p2pService();
}
  

Соответствующее сообщение об ошибке:

 Error:(21, 16) error: com.sen5.smartlifebox.App cannot be provided without an @Inject constructor or from an @Provides-annotated method.
com.sen5.smartlifebox.App is injected at
com.sen5.smartlifebox.di.module.ApplicationModule.provideP2PService(context)
com.sen5.smartlifebox.data.p2p.P2PService is provided at
com.sen5.smartlifebox.di.component.ApplicationComponent.p2pService()
  

Большое спасибо за любые предложения!

Комментарии:

1. Что такое @ContextType("Application") ?

Ответ №1:

Dagger сообщает вам, что он не знает, как обеспечить App зависимость в вашем provideP2PService методе.

Вы должны добавить @ContextType("Application") к параметру метода примерно так:

 @Provides
@Singleton
P2PService provideP2PService(@ContextType("Application") App context) {
    return new P2PService(context);
}
  

Ответ №2:

Честно говоря, я действительно смущен @ContextType («Application») в вашем коде!

Кстати, внесите эти изменения в свой код, и он будет работать:

ApplicationModule.java:

 @Module
public class ApplicationModule {
    private final App mApp;

    public ApplicationModule(App app) {
        this.mApp = app;
    }

    @Provides
    @Singleton
    App provideApplicationContext(){
        return mApp;
    }

    @Provides
    @Singleton
    P2PService provideP2PService(App context){
        return new P2PService(context);
    }
}
  

ApplicationComponent.java:

 @Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {

    void inject(MainActivity mainActivity);

}
  

и вот как вы можете использовать эту инъекцию:

App.java:

 public class App extends Application {

    ApplicationComponent applicationComponent;

    public ApplicationComponent getApplicationComponent() {
        return applicationComponent;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        applicationComponent = DaggerApplicationComponent.builder().applicationModule(new ApplicationModule(this)).build();
    }
}
  

MainActivity.java:

 public class MainActivity extends AppCompatActivity {

    @Inject
    P2PService p2PService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        App app = (App) getApplication();
        app.getApplicationComponent().inject(this);
    }
}
  

Для получения дополнительных ссылок вы можете взглянуть на этот пример репозитория, который содержит приложение для Android, разработанное с использованием Dagger, MVP, RxJava и других полезных библиотек:

http://github.com/mmirhoseini/fyber_mobile_offers

Надеюсь, это поможет 🙂