2016-12-15 2 views
0

Ich versuche, meine App mit MVP-Muster und Dagger 2 für Dependency Injection zu refaktorieren.Dagger2 kann auf Presenter Ebene aber Null auf Modell Ebene

I Erstellen Sie ein Modul, das den Anwendungskontext bereitstellt, und ich möchte erhalten Kontext, um SharedPreferences auf Model Layer zu erhalten.

I einzuspritzen Kontext auf Presenter Schicht und es funktioniert mit SharedPreference, aber wenn ich zu Musterschicht bewegen, Dagger injizieren einen null Wert auf Context variabel.

Inject

@Inject 
public Context mContext; 

App Modul

AppModule bietet Context Anwendung

@Module 
public class AppModule { 
    private App app; 

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

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

Anwendung

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

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

Hauptmodul

@Module 
public class MainModule { 

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

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

Sie können sich dieses Beispielprojekt ansehen http://github.com/mmirhoseini/marvel und diesen Artikel https://medium.com/@m_mirhoseini/yet-another-mvp-article-part-1- Lernen Sie das Projekt-d3fd553b3e21 kennen, um sich mit MVP vertraut zu machen. –

+1

@MohsenMirhoseiniArgi Ich habe diesen Artikel und GitHub Repo gelesen, bevor ich auf SO frage. Vielen Dank für Ihren tollen Artikel und Probe: D – Sucipto

Antwort

2

Da Sie die Context in Ihrem App-Modul haben, können Sie den Context als Parameter LoginModel Konstruktor hinzuzufügen.

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

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

Aber denken Sie daran, dass Sie android Pakete nur auf Ihre Aktivitäten und Fragmente für ein einfaches Testen verwenden. Dein Ansatz ist also falsch.

EDIT

für mich Nun, die beste Option ist, eine Klasse für SharedPreferences wie dieses Ich Provide

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

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

schließlich die 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(); 
    } 
} 

dann in App-Modul zu erstellen im Hauptmodul

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

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

Vielen Dank für Ihre Korrektur, ich bin gerade von "Spaghetti Code" zu MVP-Ansatz umgezogen. Ich möchte nur die Shared-Einstellungen aus der Model-Ebene ändern und die gemeinsamen Einstellungen benötigen Kontext. Anny Vorschlag? – Sucipto

+0

Vielen Dank für Ihre Tipps. Es funktioniert jetzt. : D – Sucipto

+0

Froh, dass ich geholfen habe! :) –

Verwandte Themen