2017-07-01 8 views
0

Ich kann Probleme, meinen Moderator auf das Fragment zu injizieren und ich weiß nicht warum, ich denke, ich mache alles richtig und ich bin ein bisschen verzweifelt.Inject Presenter - Dolch 2

Der Fehler ist wie folgt:

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) 

Dies ist meine Komponente:

@ViewScope 
@Component(dependencies = ApplicationComponent.class, 
     modules = {ViewModule.class, PresenterModule.class}) 
public interface ViewComponent { 

    void inject(MainActivity mainActivity); 

    void inject(ReminderListFragment reminderListFragment); 
} 

Das ist meine Module:

@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; 
    } 

} 

das ist mein Moderator:

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(); 
    } 
} 

Und mein 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); 
    } 
} 

Jeder Vorschlag ist willkommen!

Antwort

1

Sie versuchen, eine RemainderListPresenterImpl zu injizieren. Das bedeutet, dass einige Funktionen in Ihren Modulen eine RemainderListPresenterImpl bereitstellen müssen oder dass die RemainderListPresenterImpl einen Konstruktor mit der Bezeichnung @Inject haben muss. Sonst weiß es nicht, wie man es konstruiert, um es zu injizieren. Dies könnte so einfach sein wie ein Konstruktor mit 0 Argumenten ohne Körper, der mit @Inject gekennzeichnet ist.