Reputation: 353
i can problems to inject my presenter on the fragment and i dont know why, i think i'm doing everything correctly and i'm a bit desperate.
The error is as follows:
Error:(20, 10) error: com.drivero.locationreminder.presentation.main.presenter.ReminderListPresenterImpl cannot be provided without an @Inject constructor or from an @Provides-annotated method. This type supports members injection but cannot be implicitly provided.
com.drivero.locationreminder.presentation.main.presenter.ReminderListPresenterImpl is injected at
com.drivero.locationreminder.infrastructure.di.module.PresenterModule.provideReminderListPresenter(presenter)
com.drivero.locationreminder.presentation.main.presenter.ReminderListPresenter is injected at
com.drivero.locationreminder.presentation.main.fragment.ReminderListFragment.presenter
com.drivero.locationreminder.presentation.main.fragment.ReminderListFragment is injected at
com.drivero.locationreminder.infrastructure.di.component.ViewComponent.inject(reminderListFragment)
This is my component:
@ViewScope
@Component(dependencies = ApplicationComponent.class,
modules = {ViewModule.class, PresenterModule.class})
public interface ViewComponent {
void inject(MainActivity mainActivity);
void inject(ReminderListFragment reminderListFragment);
}
This is my modules:
@Module
public class ViewModule {
private Activity activity;
private Fragment fragment;
public ViewModule(Activity activity) {
this.activity = activity;
}
public ViewModule(Fragment fragment) {
this.fragment = fragment;
}
@Provides
@ViewScope
Context context() {
return activity;
}
@Provides
@ViewScope
Activity activity() {
return activity;
}
@Provides
@ViewScope
Fragment fragment() {
return fragment;
}
@Provides
@ViewScope
Navigator navigator() {
return new Navigator(activity);
}
}
@Module
public class PresenterModule {
@Provides
@ViewScope
ReminderListPresenter provideReminderListPresenter(ReminderListPresenterImpl presenter) {
return presenter;
}
}
this is my presenter:
public interface ReminderListPresenter extends Presenter<ReminderListView> {
void onClickCreate();
}
public class ReminderListPresenterImpl extends BasePresenter<ReminderListView> implements ReminderListPresenter {
@Override
public void initialize(ReminderListView view) {
super.initialize(view);
}
@Override
public void onClickCreate() {
navigator.goToCreateReminder();
}
}
And my fragment:
@ViewScope
public class ReminderListFragment extends BaseFragment implements ReminderListView {
@BindView(R.id.reminderList)
private RecyclerView reminderList;
@BindView(R.id.floatingActionButton)
private FloatingActionButton createReminderButton;
@Inject
ReminderListPresenter presenter;
public static Fragment getNewInstance() {
return new ReminderListFragment();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
presenter.initialize(this);
}
@Override
public int getLayoutContainer() {
return R.layout.fragment_reminder_list;
}
@Override
public void initializeInjector() {
buildInjector(new ViewModule(this)).inject(this);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
}
Any suggestion is welcome!
Upvotes: 0
Views: 472
Reputation: 93559
You're trying to inject a RemainderListPresenterImpl. That means that some function in your modules must provide a RemainderListPresenterImpl, or the RemainderListPresenterImpl must have a constructor marked @Inject. Otherwise it doesn't know how to construct one to inject it. This could be as simple as a 0 argument constructor with no body that's marked @Inject.
Upvotes: 1