Dagger 2 构建在单个 Inject 注释上失败
Dagger 2 build fails on single Inject annotation
我已经尝试解决这个问题好几个小时了,如有任何帮助,我们将不胜感激。
到目前为止,我的项目使用 Dagger 2 构建得非常好。我使用 @Inject
注释将另一个实例字段添加到我的一个片段中,将 void inject(MyFragment mf)
方法添加到我使用的组件中使用。但是,在添加此 @Inject 注释后,我收到一条错误消息,指出它 cannot find symbol DaggerAppComponent or DaggerLoginComponent
在我的应用程序 class 中(我已注释掉 @Inject,之后构建立即开始工作)。
为了以防万一,我确保检查了我所有模块的方法是否都有 @Provides
注释,它们都很好。
再次感谢!
这是我的应用程序 class,它使用静态方法提供我的组件:
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);
}
}
和登录组件:
@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();
}
}
编辑:在 gradle 构建文件中,我正在使用 apt 插件并提供 glassfish 注释。请注意,在 android studio 中,在编码时要求自动导入相应生成的组件,但在按下构建按钮时会导致此编译错误。
通常,您需要做的就是将以下依赖项添加到您的 gradle 文件中:
provided 'org.glassfish:javax.annotation:10.0-b28' //needed to resolve compilation errors
但是如果问题仍然存在,我们需要确切的编译错误和可能的依赖项,以及您的 LoginModule
。
您的LoginModule
可能没有提供MyLogins
。
我已经尝试解决这个问题好几个小时了,如有任何帮助,我们将不胜感激。
到目前为止,我的项目使用 Dagger 2 构建得非常好。我使用 @Inject
注释将另一个实例字段添加到我的一个片段中,将 void inject(MyFragment mf)
方法添加到我使用的组件中使用。但是,在添加此 @Inject 注释后,我收到一条错误消息,指出它 cannot find symbol DaggerAppComponent or DaggerLoginComponent
在我的应用程序 class 中(我已注释掉 @Inject,之后构建立即开始工作)。
为了以防万一,我确保检查了我所有模块的方法是否都有 @Provides
注释,它们都很好。
再次感谢!
这是我的应用程序 class,它使用静态方法提供我的组件:
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);
}
}
和登录组件:
@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();
}
}
编辑:在 gradle 构建文件中,我正在使用 apt 插件并提供 glassfish 注释。请注意,在 android studio 中,在编码时要求自动导入相应生成的组件,但在按下构建按钮时会导致此编译错误。
通常,您需要做的就是将以下依赖项添加到您的 gradle 文件中:
provided 'org.glassfish:javax.annotation:10.0-b28' //needed to resolve compilation errors
但是如果问题仍然存在,我们需要确切的编译错误和可能的依赖项,以及您的 LoginModule
。
您的LoginModule
可能没有提供MyLogins
。