当前位置: 首页 > 知识库问答 >
问题:

Dagger2可以在演示器层提供,但在模型层提供null

夏经武
2023-03-14

我创建了提供应用程序上下文的模块,我希望在模型层获得SharedPreferences上下文。

我在Presenter层注入上下文,它使用SharedPreference,但是当我移到模型层时,Dagger在Context变量上注入一个null值。

注入

@Inject
public Context mContext;
@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个答案

葛修真
2023-03-14

由于应用程序模块中有上下文,因此可以将上下文作为参数添加到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包。所以你的做法是错误的。

编辑

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();
   }
}
@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);
}
 类似资料:
  • 我尝试使用avro-python3(向后兼容性)重新创建一个模式演变案例。 我有两个模式: 第二个模式没有字段,但有两个附加字段:和。 根据avro模式演化规则,如果我用schema_v1写入avro记录: …我可以使用schema_v2读取它,前提是不存在字段有默认值 但我得到了以下错误: 我知道这在Java中有效。这是一个视频课程的示例。有没有办法让它在python中工作?

  • 我想写一篇文章在我的标题,但有一个字是一个像“链接”或“a”点击链接。标题只等待一个字符串。

  • 问题内容: 在Python官方文档说,使用切片运算符和Python中的分配,使切片列表的浅表副本。 但是,例如,当我编写代码时: 当我写: 我得到不同的ID,并且追加一个列表不会反映在另一列表中。它不是在创建深拷贝,还是在我出问题的地方? 问题答案: 您正在创建 浅表 副本,因为嵌套值不会被复制,而只是被引用。一个 深 拷贝会建立一个列表中引用过的值的副本。 演示: 此处 嵌套的 字典不被复制;这

  • 我按照TF初学者教程中的步骤创建了一个简单的分类模型。它们如下: 我保存了这个模型: 然后,我尝试使用这个TF教程为这个模型提供服务。我执行以下操作: 我试着这样称呼这个模型: 我收到以下错误: { “error”: “index = 1 不在 [0, 1)\n\t [[{{node StatefulPartitionedCall_51/StatefulPartitionedCall/sequen

  • 问题内容: 可以说我有: 我有一个 ApplicationModule ,它需要为 Rec 和 Circle 提供实例: 和 ApplicationComponent : 以这种方式使用代码-无法编译。错误说 错误:(33,20)错误:形状被绑定多次。 对我来说,这是不可行的,因为该组件正试图找到一个实例,并且它找到了两个实例,因此它不知道要返回哪个实例。 我的问题是-我该如何处理? 问题答案:

  • //模块 //组件 `//预登录Presenter //预物流活动` //在一次创建中 //错误日志 错误:(18,53)错误:找不到符号类DaggerPresentComponent错误:(19,53)错误:找不到符号类DaggerUserLoginComponent错误:(19,10)错误:gorick.gradesprojectandroid.MVP. Presenter. Presente