我如何使用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 ;
答案 0 :(得分:2)
为了告诉匕首将字段注入df.rename(index=lambda x: x*2).index
# Int64Index([0, 2, 4], dtype='int64')
类,您有2个选项。
调用LoginPresenter
告诉dagger使用模块中提供的对象设置LoginPresenter类的实例变量。请注意,这需要您在组件界面中声明此方法(如果还没有)。
或者,也可以使用鼓励的方式,使用inject(LoginPresenter)
注释构造函数并将@Inject
添加到构造函数中。