注入主持人 - Dagger 2

时间:2017-07-01 18:19:34

标签: android dependency-injection dagger-2

我可以在片段上注入我的演示者的问题,我不知道为什么,我认为我正在做的一切正确,我有点绝望。

错误如下:

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)

这是我的组成部分:

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

    void inject(MainActivity mainActivity);

    void inject(ReminderListFragment reminderListFragment);
}

这是我的模块:

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

}

这是我的主持人:

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

我的片段:

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

欢迎任何建议!

1 个答案:

答案 0 :(得分:1)

您正在尝试注入RemainderListPresenterImpl。这意味着模块中的某些函数必须提供RemainderListPresenterImpl,或者RemainderListPresenterImpl必须具有标记为@Inject的构造函数。否则它不知道如何构造一个来注入它。这可以像0参数构造函数一样简单,没有标记为@Inject的正文。