Dagger2可以在Presenter层上提供,但在Model层上为null

时间:2016-12-15 13:14:21

标签: android mvp

我正在尝试使用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();
    }
}

1 个答案:

答案 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);
}