Как добавить класс SharedPreferences как DataManager в приложение? - PullRequest
0 голосов
/ 20 декабря 2018

Я получаю эту ошибку, когда пытаюсь построить / перестроить:

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;
}
}

1 Ответ

0 голосов
/ 20 декабря 2018

Ошибка, которую вы получаете, говорит обо всем.Вы пытаетесь сослаться на модуль с другой областью действия, чем ваш компонент.

Глядя на вас ApplicationComponent:

@ApplicationScope
@Component(modules = {ContextModule.class,
RetrofitModule.class,
SharedPrefModule.class})
public interface ApplicationComponent { }

Используется ApplicationScope

Ваш ApplicationComponent затем ссылается на SharedPrefModule.
Если мы посмотрим на этот класс:

@Module
public class SharedPrefModule {
    @Provides
    @Singleton
    PreferencesHelper providePreferencesHelper(AtlasPreferencesHelper atlasPreferencesHelper) { 
        return atlasPreferencesHelper;
    }
}

Этот модуль использует область действия Singleton.Наконец, ваш AtlasPreferencesHelper также ограничен Singleton:

@Singleton
public class AtlasPreferencesHelper {}

То, что вы хотите сделать, это выровнять эти области.
Так что либо аннотируйте ApplicationComponent с @Singleton, либо используйте @Application для всех модулей в вашем ApplicationComponent

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...