我正在尝试根据Google示例使用Dagger 2学习MVP,但是我仍然遇到相同的错误:
SaveContract.Presenter不能在没有 @提供注释的方法
当我向SaveFragment注入SaveContract.Presenter时,出现相同的错误。没有@Inject Presenter时为null。
SaveFragment:
public class SaveFragment extends DaggerDialogFragment implements SaveContract.View {
private FloatingActionButton saveButton;
private EditText textEditTest;
private TextView dateEditText, timeEditText;
private DatePickerDialog.OnDateSetListener dateSetListener;
private TimePickerDialog.OnTimeSetListener timeSetListener;
@Inject
SaveContract.Presenter savePresenter;
@Inject
public SaveFragment() {
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_save, container, false);
saveButton = view.findViewById(R.id.save_button);
textEditTest = view.findViewById(R.id.text_edit_text);
dateEditText = view.findViewById(R.id.date_text_view);
timeEditText = view.findViewById(R.id.time_text_view);
saveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (textEditTest.getText().toString().trim().isEmpty()) {
Toast.makeText(getContext(), "Write something", Toast.LENGTH_SHORT).show();
}
else {
String text = textEditTest.getText().toString();
String date = dateEditText.getText().toString();
String time = timeEditText.getText().toString();
//savePresenter.addTaskClick(text, date, time);
}
}
});
dateSetListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
month = month + 1;
String date = dayOfMonth + "/" + month + "/" + year;
dateEditText.setText(date);
}
};
timeSetListener = new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
String time = hourOfDay + ":" + minute;
timeEditText.setText(time);
}
};
dateEditText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDatePicker();
}
});
timeEditText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showTimePicker();
}
});
return view;
}
@Override
public void onResume() {
super.onResume();
Window window = Objects.requireNonNull(getActivity()).getWindow();
assert window != null;
window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}
public void showDatePicker() {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(Objects.requireNonNull(getActivity()), android.R.style.Theme_Holo_Light_Dialog_MinWidth, dateSetListener,
year, month, day);
Objects.requireNonNull(dialog.getWindow()).setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.show();
}
public void showTimePicker() {
Calendar calendar = Calendar.getInstance();
int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
TimePickerDialog dialog = new TimePickerDialog(Objects.requireNonNull(getActivity()), android.R.style.Theme_Holo_Light_Dialog_MinWidth, timeSetListener,
hourOfDay, minute, DateFormat.is24HourFormat(getActivity()));
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.show();
}
@Override
public void addTaskSuccess() {
Toast.makeText(getContext(), "Task Added!", Toast.LENGTH_SHORT).show();
}
@Override
public void addTaskError() {
Toast.makeText(getContext(), "Something went wrong!", Toast.LENGTH_SHORT).show();
}
@Override
public void onStart() {
super.onStart();
}
@Override
public void onAttach(@NonNull Context context) {
savePresenter.takeView(this);
super.onAttach(context);
}
}
SaveModule:
@Module
public abstract class SaveModule {
@FragmentScope
@Binds
abstract SaveContract.Presenter savePresenter(SavePresenter savePresenter);
}
SavePresenter:
public final class SavePresenter implements SaveContract.Presenter, RealmService.OnTransactionCallback, BasePresenter<SaveContract.View> {
@Inject
public SavePresenter() {
}
@Override
public void setView(Object view) {
}
@Override
public void addTaskClick(String text, String date, String time) {
// realmService.addTask(text, date, time, this);
}
@Override
public void onRealmSuccess() {
}
@Override
public void onRealmError(Throwable error) {
error.printStackTrace();
}
@Override
public void takeView(SaveContract.View view) {
}
@Override
public void dropView() {
}
}
SaveContract:
public interface SaveContract {
interface View extends BaseView<Presenter> {
void addTaskSuccess();
void addTaskError();
}
interface Presenter extends BasePresenter<View> {
void setView(Object view);
void addTaskClick(final String text, final String date, final String time);
}
}