java-匕首:android.content.Context上没有可注入成员.您是否要添加可注入的构造函数?类要求的模块

java-匕首:android.content.Context上没有可注入成员.您是否要添加可注入的构造函数?类要求的模块,第1张

概述我正在尝试将要与Dagger一起注入的单身CookieUtil转换为LoginActivity.CookieUtil为此具有应用程序上下文,我已经建立了以下结构:Android模块@Module(injects={CookieUtil.class,LoginActivity.class},library=true)

我正在尝试将要与Dagger一起注入的单身cookieUtil转换为LoginActivity. cookieUtil为此具有应用程序上下文,我已经建立了以下结构:

Android模块

@Module(        injects = {            cookieUtil.class,            LoginActivity.class        },        library = true)public class AndroIDModule {    private final App application;    public AndroIDModule(App application) {        this.application = application;    }    /**     * Allow the application context to be injected but require that it be annotated with     * {@link ForApplication @Annotation} to explicitly differentiate it from an activity context.     */    @ProvIDes    @Singleton    @ForApplication    Context provIDeApplicationContext() {        return application;    }    @ProvIDes    @Singleton    cookieUtil provIDecookieUtil() {        return new cookieUtil();    }}

cookieUtil(我想注入到LoginActivity中的内容)

@Singletonpublic class cookieUtil {    @Inject Context mContext; // gets injected with a app context. is this right ?    private PersistentcookieStore persistentcookieStore;    private cookieUtil() {      // use injected mContext      persistentcookieStore = new PersistentcookieStore(mContext);      // ...    }}

LoginActivity(我要在其中注入cookieUtil的位置)

公共类LoginActivity扩展BaseActivity {
    @Inject cookieUtil cookieUtil;

@OverrIDeprotected voID onCreate(Bundle savedInstanceState) {  // use cookieUtil ...}

}

我还设置了Dagger示例中的所有引导程序,以使一切正常工作

基础活动

public class BaseActivity extends ActionBaractivity {    @OverrIDe protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // Perform injection so that when this call returns all dependencIEs will be available for use.        ((App) getApplication()).inject(this);    }}

应用程式

public class App extends Application {  private ObjectGraph graph;  public voID onCreate() {    super.onCreate();    graph = ObjectGraph.create(getModules().toArray());    // ...  }  protected List<Object> getModules() {    return Arrays.asList(      new AndroIDModule(this),      new CupsModule() // Another module I haven't Listed    );  }  public voID inject(Object object) {      graph.inject(object);  }}

申请

@QualifIEr@Retention(RUNTIME)public @interface ForApplication {}

当我运行代码时,我得到

No injectable members on androID.content.Context. Do you want to add
an injectable constructor? required by cookieUtil for AndroIDModule

我究竟做错了什么 ?

对我来说,一切仍然看起来像魔术,因为我不完全了解如何将所有内容连接起来,因此,非常感谢您提供详细的解释.

此外,如果有人可以指出我对dagger模块的解释,将它分成两个不同的模块什么时候有意义?它们通常绑定哪些逻辑块?

谢谢

编辑

由克里斯蒂安·格鲁伯(Christian Gruber)建议更改

@Singletonpublic class cookieUtil {    private Context mContext;    private PersistentcookieStore persistentcookieStore;    @Inject    public cookieUtil(Context context) {          // use injected context          mContext = context          persistentcookieStore = new PersistentcookieStore(mContext);          // ...    }}

解决方法:

cookie不能具有私有构造函数,并且仍由Dagger创建(提供).您可以有一个对程序包友好的构造函数,然后它可以在没有@ProvIDes CookiUtil …的情况下正常工作.

一般来说,Dagger会根据其类型(带有具体的类型参数,例如Foo< bar>)以及任何@QualifIEr来考虑根据“键”进行“绑定”.因此,类型Foo< bar>与@ForApplication Foo< bar>不同.无论@Inject发生在哪里,都将请求绑定,并且@ProvIDes发生的地方将提供绑定(或者对于不合格的绑定,如果类具有@Inject标记的构造函数或字段,则提供隐式绑定.对于每个@Inject字段或构造函数参数Dagger必须能够看到它用于创建事物的方法,因此通常不可能使用私有字段,方法和构造函数.

另外,请不要在没有限定符的情况下简单地注入Context.或更佳的是,如果您要表示的是Context子类型,则注入Application或Activity.如果您不区分AndroID称为Context子类型的30,000种事物,则将无法管理您的图形. (蛇声)

总结

以上是内存溢出为你收集整理的java-匕首:android.content.Context上没有可注入成员.您是否要添加可注入的构造函数?类要求的模块全部内容,希望文章能够帮你解决java-匕首:android.content.Context上没有可注入成员.您是否要添加可注入的构造函数?类要求的模块所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1076682.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存