Я получаю эту ошибку, когда пытаюсь построить / перестроить:
error: ir.atlaspio.roshdbookstore.DI.Components.ApplicationComponent scoped with @ir.atlaspio.roshdbookstore.DI.Scopes.ApplicationScope may not reference bindings with different scopes:
@Singleton class ir.atlaspio.roshdbookstore.Data.Prefs.AtlasPreferencesHelper
Я пытаюсь улучшить свою кодовую базу для некоторых проектов и учебных пособий, сейчас я пытаюсьделать инъекцию зависимостей для SharedPreferences, что у меня выше проблемы.Прошло не так много времени с тех пор, как я связался с Dagger 2 и DI, так что извините мой вопрос новичка и помогите мне выяснить, где я делаю это неправильно.также есть некоторые коды, которые они будут вводить SharedPrefereces
, но я хочу использовать Мой собственный DataManager, чтобы сделать это правильно.Итак, вот как я создал свой проект (который основан на некоторых уроках):
Объясняющий раздел (который может быть очевиден для вас, ребята): добавление некоторого метода для установки данных в sharedpref.AtlasPreferencesHelper:
@Singleton
public class AtlasPreferencesHelper implements PreferencesHelper {
private static final String PREF_KEY_USER_LOGGED_IN_MODE = "PREF_KEY_USER_LOGGED_IN_MODE";
private static final String PREF_KEY_FIRST_TIME_RUN_MODE = "PREF_KEY_FIRST_TIME_RUN_MODE";
private final SharedPreferences atlasPrefs;
@Inject
public AtlasPreferencesHelper(@ApplicationContext Context context,
@PreferenceInfo String prefFileName) {
atlasPrefs = context.getSharedPreferences(prefFileName, Context.MODE_PRIVATE);
}
@Override
public int getCurrentUserLoggedInMode() {
return atlasPrefs.getInt(PREF_KEY_USER_LOGGED_IN_MODE,
DataManager.LoggedInMode.LOGGED_IN_MODE_LOGGED_OUT.getType());
}
@Override
public void setCurrentUserLoggedInMode(DataManager.LoggedInMode mode) {
atlasPrefs.edit().putInt(PREF_KEY_USER_LOGGED_IN_MODE, mode.getType()).apply();
}
@Override
public int getCurrentFirstTimeStat() {
return atlasPrefs.getInt(PREF_KEY_FIRST_TIME_RUN_MODE,
DataManager.FirstTimeRun.FIRST_TIME_RUN_TRUE.getFrType());
}
@Override
public void setCurrentFirstTimeStat(DataManager.FirstTimeRun fMode) {
atlasPrefs.edit().putInt(PREF_KEY_FIRST_TIME_RUN_MODE, fMode.getFrType()).apply();
}
}
Объясняет: интерфейс, который будет реализован в AtlasPreferencesHelper.PreferenceHelper:
public interface PreferencesHelper {
int getCurrentUserLoggedInMode();
void setCurrentUserLoggedInMode(DataManager.LoggedInMode mode);
int getCurrentFirstTimeStat();
void setCurrentFirstTimeStat(DataManager.FirstTimeRun fMode);
}
Объясняет: выполнение задания и получение доступа к деятельности для использования методов.AppDataManager:
public class AppDataManager implements DataManager {
private static final String TAG = "AppDataManager";
private final Context mContext;
private final PreferencesHelper mPrefencesHelper;
@Inject
public AppDataManager(@ApplicationContext Context context, PreferencesHelper prefencesHelper) {
mContext = context;
mPrefencesHelper = prefencesHelper;
}
@Override
public void setUserAssLoggedOut() {
setCurrentUserLoggedInMode(LoggedInMode.LOGGED_IN_MODE_LOGGED_OUT);
}
@Override
public int getCurrentUserLoggedInMode() {
return mPrefencesHelper.getCurrentUserLoggedInMode();
}
@Override
public void setCurrentUserLoggedInMode(LoggedInMode mode) {
mPrefencesHelper.setCurrentUserLoggedInMode(mode);
}
@Override
public int getCurrentFirstTimeStat() {
return mPrefencesHelper.getCurrentFirstTimeStat();
}
@Override
public void setCurrentFirstTimeStat(FirstTimeRun fMode) {
mPrefencesHelper.setCurrentFirstTimeStat(fMode);
}
}
Объясняет: интерфейс DataManager, реализованный в AppDataManager DataManager:
public interface DataManager extends PreferencesHelper {
void setUserAssLoggedOut();
enum LoggedInMode {
LOGGED_IN_MODE_LOGGED_OUT(0),
LOGGED_IN_MODE_SERVER(1);
private final int mType;
LoggedInMode(int type)
{
mType = type;
}
public int getType()
{
return mType;
}
}
enum FirstTimeRun {
FIRST_TIME_RUN_FALSE(0),
FIRST_TIME_RUN_TRUE(1);
private final int frType;
FirstTimeRun(int rType){
frType = rType;
}
public int getFrType()
{
return frType;
}
}
}
Объясняет: компоненты, которые, Context предоставляют контекст, Retrofit Provide retrofit и SharedPref предоставят Datamanager и SharedPref ApplicationComponent:
@ApplicationScope
@Component(modules = {ContextModule.class,
RetrofitModule.class,
SharedPrefModule.class})
public interface ApplicationComponent {
MyAtlasAPI getApiReference();
DataManager getDataManager();
@ApplicationContext
Context getContext();
void injectApplication(AtlasApplication atlasApplication);
}
Объясняет: модуль, который будет реализован в компоненте для datamanager и sharedpref SharedPrefModule:
@Module
public class SharedPrefModule {
@Provides
@PreferenceInfo
String providePreferenceName() {
return AppConstants.PREF_NAME;
}
@Provides
@Singleton
DataManager provideDataManager(AppDataManager appDataManager)
{
return appDataManager;
}
@Provides
@Singleton
PreferencesHelper providePreferencesHelper(AtlasPreferencesHelper atlasPreferencesHelper)
{
return atlasPreferencesHelper;
}
}