2017-02-04 16 views
0

如何使用匕首2以便我可以使用共享首選項的抽象表示形式,而不必在每次使用它時都要初始化接口? 我有共同的喜好在數據層像這樣的包裝:如何使用匕首2以便我可以使用共享偏好的抽象表示?

public interface SharedPrefsWrapper { 

    void putBoolean(String key, boolean value); 

    boolean getBoolean(String key); 

    void putString(String key, String value); 

    String getString(String key); 

    void putInt(String key, int value); 

    int getInt(String key); 

    void putFloat(String key, float value); 

    float getFloat(String key); 

    void putLong(String key, long value); 

    long getLong(String key); 


} 

然後,我有它在應用層實現:

public class SharedPreferenceImpl implements SharedPrefsWrapper { 

private SharedPreferences sharedPreferences; 

private Context context; 
private static final String PREFS= "Wyat_prefs"; 

public SharedPreferenceImpl(Context context) { 
    this.context = context; 
} 

@Override 
public void putBoolean(String key, boolean value) { 

} 

@Override 
public boolean getBoolean(String key) { 
    return false; 
} 

@Override 
public void putString(String key, String value) { 

    SharedPreferences.Editor editor = context.getSharedPreferences(PREFS,0).edit(); 
    editor.putString(key,value); 
    editor.apply(); 

} 

@Override 
public String getString(String key) { 

    sharedPreferences = context.getSharedPreferences(PREFS,0); 


    return sharedPreferences.getString(key,null); 
} 

,我做了依賴注入,像這樣的匕首:

@Provides @Singleton 
SharedPreferenceImpl providesSharedPreference(WyatApplication wyatApplication){ 
    return new SharedPreferenceImpl(wyatApplication); 
} 

@Provides @Singleton 
SharedPrefsWrapper providesSharedPrefsWrapper(SharedPreferenceImpl sharedPreference){ 
    return sharedPreference; 
} 
@Singleton @Component(modules = AppModule.class) 
public interface AppComponent { 

WyatApplication wyatapplication(); 

WyatRepository wyatrepository(); 

SharedPrefsWrapper sharedPreference(); 

} 

當我試圖從主持人的共享偏好中保存一些東西時,我得到一個空指針,我試圖像這樣保存它:

sharedPrefsWrapper.putString("token",accessToken.getAccessToken()); 

從而使抽象used.I已籤,我可以看到當我登錄它,所以它是沒有問題的訪問令牌。 我忘了做些什麼,或者我使用了錯誤的方法?

編輯: 我注入這樣的包裝到主持人

public class LoginPresenter implements Presenter<LoginView> { 

    private GetAccessTokenUseCase getAccessTokenUseCase; 
    private Subscription subscription; 
    private String email; 
    private String password; 


    @Inject 
    SharedPrefsWrapper sharedPrefsWrapper ; 
+0

你在哪裏注入包裝器實現? – Phil

+0

@Phil我在編輯中添加了代碼以顯示我如何注入包裝。我沒有在任何地方注入實施。 – zacmwa

+0

模塊和組件看起來沒問題。如果它們不是,你的代碼就不會編譯。你如何在你的片段或活動中注入演示者?我認爲這是問題 –

回答

2

爲了告訴匕首到外地注入LoginPresenter類,你有2種選擇。

要麼撥打inject(LoginPresenter)告訴Dagger使用模塊中提供的對象來設置LoginPresenter類的實例變量。請注意,這需要您在組件界面中聲明此方法(如果尚未存在)。

或者,如果可能的話,這也是鼓勵的方式,用構造函數@Inject對構造函數進行註釋,並將SharedPerfsWrapper添加到構造函數中。

相關問題