#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 и других полезных библиотек:
Надеюсь, это поможет 🙂