2016-12-15 6 views
0

Я пытаюсь реорганизовать мое приложение с помощью MVP шаблон и Dagger 2 для Dependency Injection.Dagger2 может обеспечить на Presenter слое, но нуль на модели слоя

Создает модуль, который обеспечивает контекст приложений, и я хочу получить контекст, чтобы получить SharedPreferences на уровне модели.

я впрыснуть контекст на Presenter слой и он работает с SharedPreference, но когда я перехожу к модели слоя, Dagger придать значение null на Context переменной.

Вводят

@Inject 
public Context mContext; 

App Модуль

AppModule предоставляет контекст приложения

@Module 
public class AppModule { 
    private App app; 

    public AppModule(App app){ 
     this.app = app; 
    } 

    @Provides 
    public Context providesApp(){ 
     return app.getApplicationContext(); 
    } 
} 

Application

public class App extends Application { 

    private AppComponent appComponent; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     appComponent = DaggerAppComponent.builder() 
       .appModule(new AppModule(this)) 
       .mainModule(new MainModule()) 
       .build(); 
    } 

    public AppComponent getAppComponent(){ 
     return appComponent; 
    } 
} 

App Компонент

@Component(modules = {AppModule.class,MainModule.class}) 
public interface AppComponent { 
    void inject(MainActivity activity); 
    void inject(LoginActivity activity); 
} 

Главный модуль

@Module 
public class MainModule { 

    @Provides 
    public MainContract.Model providesMainModel(){ 
     return new MainModel(); 
    } 

    @Provides 
    public LoginContract.Model providesLoginModel(){ 
     return new LoginModel(); 
    } 
} 
+0

Вы можете посмотреть этот образец проекта http://github.com/mmirhoseini/marvel и в этой статье https://medium.com/@m_mirhoseini/yet-another-mvp-article-part-1- let-get-to-know-the-project-d3fd553b3e21, чтобы лучше узнать MVP. –

+1

@MohsenMirhoseiniArgi Я прочитал эту статью и репетицию GitHub, прежде чем спросить о SO. Спасибо за вашу замечательную статью и образец: D – Sucipto

ответ

2

Поскольку у вас есть Context в вашем модуле App, вы можете добавить Context в качестве параметра LoginModel конструктора.

@Provides 
public LoginContract.Model providesLoginModel(Context contect){ 
    return new LoginModel(contect); 
} 

@Provides 
public LoginContract.Presenter providesLoginPresenter(LoginContract.Model model){ 
    return new LoginPresenter(model); 
} 

Но имейте в виду, что вы должны использовать android пакеты только на вашей деятельности и фрагментов для простого тестирования. Поэтому ваш подход неправильный.

EDIT

Ну для меня лучший вариант, чтобы создать класс для SharedPreferences как этот

public class Preferences { 
    private final SharedPreferences preferences; 
    private String key; 
    private String defaultValue; 

    public StringPreferences(@NonNull SharedPreferences preferences) { 
    this.preferences = preferences; 
    } 

    @Nullable 
    public String get(String mykey) { 
    return preferences.getString(mykey, defaultValue); 
    } 

    public void set(@NonNull String mykey, @Nullable String value) { 
    preferences.edit().putString(mykey, value).apply(); 
    } 

    // same way for integers, longs, doubles and booleans 

    public boolean isSet() { 
    return preferences.contains(key); 
    } 

    public void delete() { 
    preferences.edit().remove(key).apply(); 
    } 
} 

Тогда в App Модуль I Provide в SharedPreferences

@Provides 
@Singleton 
public SharedPreferences provideSharedPreferences(Context context) { 
    return PreferenceManager.getDefaultSharedPreferences(context); 
} 

@Provides 
@Singleton 
public Preferences providePreferences(SharedPreferences prefs) { 
    return new Preferences(prefs); 
} 

Наконец в основном модуле

@Provides 
public LoginContract.Model providesLoginModel(Preferences prefs){ 
    return new LoginModel(prefs); 
} 

@Provides 
public LoginContract.Presenter providesLoginPresenter(LoginContract.Model model){ 
    return new LoginPresenter(model); 
} 
+0

Спасибо за исправление, я просто перешел от «кода спагетти» к подходу MVP. Я просто хочу изменить Shared preferences из слоя Model, а для общих предпочтений нужен контекст. Anny предложение? – Sucipto

+0

Благодарим вас за советы. Теперь работает. : D – Sucipto

+0

Рад, что я помог! :) –

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

  • Нет связанных вопросов^_^