Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Dagger:android.content.Context上没有可注入成员。是否要添加可注入构造函数?课程对模块的要求_Java_Android_Dependency Injection_Dagger - Fatal编程技术网

Java Dagger:android.content.Context上没有可注入成员。是否要添加可注入构造函数?课程对模块的要求

Java Dagger:android.content.Context上没有可注入成员。是否要添加可注入构造函数?课程对模块的要求,java,android,dependency-injection,dagger,Java,Android,Dependency Injection,Dagger,我正在尝试将我的singletonCookieUtil与Dagger一起注入到LoginActivityCookieUtil接受一个应用程序上下文,因此我设置了以下结构: 雄激素模块 CookieUtil(我想注入LoginActivity的内容) LoginActivity(我想在其中注入CookieUtil) 公共类LoginActivity扩展了BaseActivity{ @注入CookieUtil CookieUtil @Override protected void onCreate(

我正在尝试将我的singleton
CookieUtil
与Dagger一起注入到
LoginActivity
CookieUtil
接受一个应用程序
上下文
,因此我设置了以下结构:

雄激素模块 CookieUtil(我想注入LoginActivity的内容) LoginActivity(我想在其中注入CookieUtil) 公共类LoginActivity扩展了BaseActivity{ @注入CookieUtil CookieUtil

@Override
protected void onCreate(Bundle savedInstanceState) {
  // use CookieUtil ...
}
}

我还设置了Dagger示例中的所有bootstraping内容,以使一切正常工作

基本活动 应用程序 当我运行代码时,我得到

android.content.Context上没有可注入成员。是否要添加 可注入构造函数?AndroidModule的CookieUtil要求

我做错了什么

在我看来,一切仍然像魔术一样,因为我不完全知道如何将一切连接起来,所以非常感谢您的详细解释

另外,如果有人能给我一个关于dagger模块的解释,我会很有帮助,什么时候分为两个不同的模块才有意义?它们通常绑定哪些逻辑片段

谢谢

编辑 Christian Gruber建议的更改

@Singleton
public class CookieUtil {
    private Context mContext;
    private PersistentCookieStore persistentCookieStore;

    @Inject
    public CookieUtil(Context context) {
          // use injected context
          mContext = context
          persistentCookieStore = new PersistentCookieStore(mContext);
          // ...
    }
}

Cookie不能有私有构造函数,并且仍然可以由Dagger创建(配置)。您可以有一个包友好的构造函数,然后它应该在没有
@提供CookiUtil…
的情况下工作。使用该方法为您控制的类提供了方法,并可能使其成为可注入的,这似乎是浪费

一般来说,Dagger根据其类型(带有具体类型参数,如
Foo
)以及任何
@限定符来考虑“绑定”。因此类型
Foo
与应用程序Foo
的类型
@不同。只要出现
@Inject
,就会请求绑定,只要出现
@Provides
,就会提供绑定(或者对于非限定绑定,如果类具有标记为
@Inject
的构造函数或字段,则提供隐式绑定。对于每个
@Inject
字段或构造函数参数,该键必须有一个当前绑定。Dagger需要能够看到它用于创建内容的方法,因此通常为
private
字段、方法和构造函数是不可能的


此外,请不要在没有限定符的情况下简单地注入
上下文
。或者更好的方法是,如果这是
上下文
子类型,则注入
应用程序
活动
。如果你不区分Android调用的30000个
上下文
子类型,你的图表将无法管理。(snark)

谢谢。(
应用程序
以前在那里,我没有提到过,对不起)我已经将构造函数更改为public,并用
@Inject
而不是上面的成员注入对其进行了注释。我对答案进行了一些编辑以显示我的更改。仍然会出现相同的错误。我希望
CookieUtil
成为一个广泛应用程序实用程序类,我可以在需要时随时注入它(即
LoginActivity
)作为一个单身汉使用。我对DI还不熟悉,还在这里尝试着找出我的步骤。尝试着从示例中学习,但它们非常稀少,文档假定了一定程度的知识。顺便说一句,问题不在于你,而在于安卓团队将一切都作为一个上下文。:DUnderstandable:)尽管如此,我还是很想将dagger添加到我的项目中,只是似乎找不到一个完全符合我要求的示例(一个需要上下文的单例类)。我觉得我在大概的范围内,但尝试过任何可能的组合,但似乎从未成功。即将失去希望并继续前进,如果你知道可能有什么问题,请与世界其他人分享。嗯……你的CookieUtil不注入
@ForProvides Context
它只注入
Context
。你需要@Pr提供您注入的同一类型…包括
@Qualifier
注释。此外,我将使
@提供的
方法中的PersistentCookieStore在CookieUtil类中不是新的,因此您不会在CookieUtil的单元测试中测试PersistentCookieStore。
@Override
protected void onCreate(Bundle savedInstanceState) {
  // use CookieUtil ...
}
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 {
}
@Singleton
public class CookieUtil {
    private Context mContext;
    private PersistentCookieStore persistentCookieStore;

    @Inject
    public CookieUtil(Context context) {
          // use injected context
          mContext = context
          persistentCookieStore = new PersistentCookieStore(mContext);
          // ...
    }
}