我如何使用匕首2以便我可以使用共享偏好的抽象表示?

时间:2017-02-04 10:29:25

标签: java android dagger-2

我如何使用dagger 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);


}

然后我在app层中实现它:

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

以便使用抽象。我已经检查过,当我记录它时我可以看到访问令牌所以它不是问题。 我忘了做某事还是我使用了错误的做法?

编辑: 我把这样的包装器注入了演示者

public class LoginPresenter implements Presenter<LoginView> {

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


     @Inject
     SharedPrefsWrapper sharedPrefsWrapper ;

1 个答案:

答案 0 :(得分:2)

为了告诉匕首将字段注入df.rename(index=lambda x: x*2).index # Int64Index([0, 2, 4], dtype='int64') 类,您有2个选项。

调用LoginPresenter告诉dagger使用模块中提供的对象设置LoginPresenter类的实例变量。请注意,这需要您在组件界面中声明此方法(如果还没有)。

或者,也可以使用鼓励的方式,使用inject(LoginPresenter)注释构造函数并将@Inject添加到构造函数中。