There are two singletone and presenter classes that need to be injected (one class ( BindCityManager ) to another ( CityListSPController ), and the presenter, the presenter itself in view)
AppModule:
@Module public class AppModule { private Context mContext; public AppModule(Context context) { mContext = context; } @Provides @Singleton Context provideContext() { return mContext; } } DataModule:
@Module public class DataModule { @Provides @Singleton public BindCityManager provideBindCityManager(Context context) { return BindCityManager.getInstance(context); } @Provides @Singleton public CityListSPController provideCityListSPController(Context context) { return CityListSPController.getInstance(context); } } DataComponent:
@Component (modules = {DataModule.class, AppModule.class}) @Singleton public interface DataComponent { void inject(CitiesPresenter presenter); void inject(CityListSPController controller); } And the presenter itself:
public class CitiesPresenter implements CitiesContract.Presenter { @Inject BindCityManager mBindCityManager; @Inject CityListSPController mCityListSPController; CitiesContract.View mView; @Inject CitiesPresenter(CitiesContract.View view) { mView = view; } //..other methods}
Presenter Module
@Module public class CitiesPresenterModule { private final CitiesContract.View mView; public CitiesPresenterModule(CitiesContract.View view) {mView = view;} @Provides CitiesContract.View provideCitiesContractView() { return mView; } } And component
@Component (dependencies = {DataComponent.class}, modules = CitiesPresenterModule.class) public interface CitiesPresenterComponent { void inject(CitiesFragment fragment); CitiesPresenter getPresenter(); } In the view I act as follows:
public class CitiesFragment extends Fragment implements CitiesContract.View { @Inject CitiesPresenter presenter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.cities_fragment, container, false); DaggerCitiesPresenterComponent.builder() .citiesPresenterModule(new CitiesPresenterModule(this)) .build() .inject(this); return rootView; } } But there is a compilation error that I cannot overcome:
Error:(5, 48) error: cannot find symbol class DaggerDataComponent Error:(19, 54) error: cannot find symbol class DaggerCitiesPresenterComponent Error:(9, 1) error: com.luxary_team.simpleweather.presenter.cities.CitiesPresenterComponent (unscoped) cannot depend on scoped components: @Singleton com.luxary_team.simpleweather.controller.DataComponent Error:(12, 10) error: com.luxary_team.simpleweather.controller.data_controllers.BindCityManager cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method. com.luxary_team.simpleweather.controller.data_controllers.BindCityManager is injected at com.luxary_team.simpleweather.presenter.cities.CitiesPresenter.mBindCityManager com.luxary_team.simpleweather.presenter.cities.CitiesPresenter is injected at com.luxary_team.simpleweather.ui.fragment.cities.CitiesFragment.presenter com.luxary_team.simpleweather.ui.fragment.cities.CitiesFragment is injected at com.luxary_team.simpleweather.presenter.cities.CitiesPresenterComponent.inject(fragment) Tell me, what did I do wrong when declaring dependencies?
UPD. Made some amendments to the CitiesPresenterComponent class replacing the annotation with
@Component (modules = {CitiesPresenterModule.class, AppModule.class, DataModule.class}) Now another error occurs
Error:(10, 1) error: com.luxary_team.simpleweather.presenter.cities.CitiesPresenterComponent (unscoped) may not reference scoped bindings: @Provides @Singleton com.luxary_team.simpleweather.controller.data_controllers.BindCityManager com.luxary_team.simpleweather.controller.data_controllers.DataModule.provideBindCityManager(android.content.Context) @Provides @Singleton android.content.Context com.luxary_team.simpleweather.AppModule.provideContext() @Provides @Singleton com.luxary_team.simpleweather.controller.data_controllers.CityListSPController com.luxary_team.simpleweather.controller.data_controllers.DataModule.provideCityListSPController(android.content.Context)