Я пытаюсь понять это сейчас, в течение нескольких часов, и любая помощь будет оценена по достоинству.Ошибка сборки кинжала 2 при одиночной аннотации ввода
До сих пор мой проект строился отлично с помощью кинжала 2. Я добавил еще одно поле экземпляра в один из моих фрагментов с аннотацией @Inject
, добавив метод void inject(MyFragment mf)
в компонент, который я использовал. Однако после добавления этой аннотации @Inject я получаю сообщение об ошибке cannot find symbol DaggerAppComponent or DaggerLoginComponent
в моем классе приложения (я прокомментировал @Inject, и сборка работала сразу после этого).
Я убедился, что все методы моих модулей содержат аннотацию @Provides
на всякий случай, и все в порядке.
Снова, спасибо заранее!
Вот мой класс Application, который предоставляет свои компоненты, используя статические методы:
public class CleanupApplication extends Application {
private static AppComponent appComponent;
private static LoginComponent loginComponent;
public static AppComponent getAppComponent() {
return appComponent;
}
public static LoginComponent getLoginComponent() {
return loginComponent;
}
public static void setComponents(MainActivity ma) {
appComponent= DaggerAppComponent.builder().appModule(new AppModule(ma)).build();
//Update LoginComponent accordingly
loginComponent= DaggerLoginComponent.builder().appComponent(appComponent).loginModule(
new LoginModule()).build();
}
@Override
public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
и LoginComponent:
@Component(dependencies = {AppComponent.class}, modules = {LoginModule.class})
public interface LoginComponent {
void inject(LoginListFragment llf);
void inject(LoginDialogFragment ldf);
Logins logins();
MyLogins myLogins();
}
и фрагмент, который я инъекционного в том, что вызывает ошибку:
public class LoginDialogFragment extends DialogFragment implements ExtendedFragment {
final int MIN_PER_HOUR = 60, SEC_PER_MIN = 60, SEC_PER_MILLISEC = 1000;
ScrollView mDialogLayout;
@Inject //This one works just fine, using an upstream component
Context ctx;
@Bind(R.id.login_dialog_date_picker)
DatePicker mDatePicker;
@Bind(R.id.login_dialog_time_picker)
TimePicker mTimePicker;
@Bind(R.id.login_dialog_first_name_edit_text)
EditText mFirstName;
@Bind(R.id.login_dialog_last_name_edit_text)
EditText mLastName;
@Bind(R.id.login_dialog_confirmation_code_edit_text)
EditText mConfirmationCode;
@Inject //THIS IS WHERE IT FAILS
MyLogins loginList;
private int loginPosition;
private MyLogin login;
private MyLoginEvent loginEvent;
private OnSuccessfulCompletion onCompletion;
boolean mIsEdit;
private String mLoginType = null;
public LoginDialogFragment() {
this(false, -1);
}
public LoginDialogFragment(boolean changeLogin, int pos) {
this.mIsEdit = changeLogin;
this.loginPosition=pos;
CleanupApplication.getLoginComponent().inject(this); //WHERE I INJECT MY LOGINCOMPONENT TO MEMBER FIELDS
}
@Override
public Dialog onCreateDialog(Bundle bundle) {
mDialogLayout = (ScrollView) getActivity().getLayoutInflater().inflate(R.layout.fragment_login_dialog, null);
ButterKnife.bind(this, mDialogLayout);
mDatePicker.setCalendarViewShown(false);
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity());
dialogBuilder.setTitle(mLoginType);
//dialogBuilder.setView(getActivity().getLayoutInflater().inflate(R.layout.fragment_login_dialog, null));
dialogBuilder.setView(mDialogLayout);
//.setIcon(id)
if (mIsEdit && loginPosition >= 0) {
login= (SouthwestLogin) loginList.get(loginPosition);
Date flightDate=login.getMyLoginEvent().getFlightDate();
Calendar cal= Calendar.getInstance();
cal.setTime(flightDate);
mDatePicker.updateDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)
, cal.get(Calendar.DAY_OF_MONTH));
if(Build.VERSION.SDK_INT>=23) {
mTimePicker.setHour(cal.get(Calendar.HOUR));
mTimePicker.setMinute(cal.get(Calendar.MINUTE));
} else {
mTimePicker.setCurrentHour(cal.get(Calendar.HOUR));
mTimePicker.setCurrentMinute(cal.get(Calendar.MINUTE));
}
dialogBuilder.setPositiveButton(R.string.dialog_save, dialogClickListener)
.setNegativeButton(R.string.dialog_cancel, dialogClickListener);
} else {
dialogBuilder.setPositiveButton(R.string.dialog_submit, dialogClickListener).
setNegativeButton(R.string.dialog_cancel, dialogClickListener); //TODO);
}
return dialogBuilder.create();
}
}
EDIT: В файле построения градации я использую apt plugin и pr овязывание аннотаций из морской рыбы. Обратите внимание, что в студии android при кодировании он запрашивает автоматический импорт соответствующих сгенерированных компонентов, но при нажатии кнопки сборки он приводит к этой ошибке компиляции.
Пожалуйста, также включите модуль, в котором вы '@Provide MyLogins предоставляетеLogin()', это должно быть где-то в модулях 'AppComponent' или' LoginModule'. –