1

Я пытаюсь понять это сейчас, в течение нескольких часов, и любая помощь будет оценена по достоинству.Ошибка сборки кинжала 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 при кодировании он запрашивает автоматический импорт соответствующих сгенерированных компонентов, но при нажатии кнопки сборки он приводит к этой ошибке компиляции.

+0

Пожалуйста, также включите модуль, в котором вы '@Provide MyLogins предоставляетеLogin()', это должно быть где-то в модулях 'AppComponent' или' LoginModule'. –

ответ

2

Обычно, все, что вам нужно сделать, это добавить следующую зависимость для вашего Gradle файла:

provided 'org.glassfish:javax.annotation:10.0-b28' //needed to resolve compilation errors 

Но мы должны были бы точные ошибки компиляции и, возможно, ваша зависимость, если проблема не исчезнет, ​​и ваш LoginModule.

Ваш LoginModule, вероятно, не предусматривает MyLogins.

+0

Да, этот лайнер сделал это, спасибо! – stanfordude

Смежные вопросы