2016-12-15 70 views
0

我正在嘗試使用MVP模式和Dagger 2對依賴注入進行重構。Dagger2可以在Presenter圖層上提供,但在模型圖層上爲null

我創建提供應用程序上下文的模塊,並且我想讓上下文在Model Layer上獲得SharedPreferences

我注入語境演示層,它的工作與SharedPreference,但是當我移動到模型層,匕首上Context變量注入null值。

進樣

@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(); 
    } 
} 

應用

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

應用組件

@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-讓我們瞭解項目d3fd553b3e21以更熟悉MVP。 –

+1

@MohsenMirhoseiniArgi在我問這個問題之前,我已經閱讀過這些文章和GitHub回購。感謝您的精彩文章和示例:D – Sucipto

回答

2

既然你在你的應用程序模塊有Context,可以作爲參數添加到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包。所以你的方法是錯誤的。

編輯

那麼對我來說,最好的選擇是創建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模塊我ProvideSharedPreferences

@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

感謝您的糾正,我剛剛從「Spaghetti Code」移至MVP方法。我只想修改模型層的共享首選項,共享首選項需要上下文。安妮的建議? – Sucipto

+0

謝謝你的提示。現在正在工作。 :D – Sucipto

+0

很高興我幫了忙! :) –

相關問題