我正在尝试使用MVP模式和Dagger 2重构我的应用程序以进行依赖注入。
我创建提供应用程序上下文的模块,我希望获取上下文在模型层上获取SharedPreferences
。
我在Presenter图层上注入了Context,并且它正在使用SharedPreference
,但是当我转移到Model层时,Dagger会在null
变量上注入Context
值。
进样
@Inject
public Context mContext;
应用模块
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 :(得分: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 Module I Provide
SharedPreferences
@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);
}