我是匕首的新手,我的构造函数/方法注射似乎不起作用。 不起作用意味着仍然要求注入的字段。
这是我的代码:
@Module
public class AppContextModule {
private final Context appContext;
public AppContextModule(Context appContext) {
this.appContext = appContext;
}
@Singleton
@Provides
public Context getAppContext() {
return appContext;
}
}
@Singleton
@Component(modules = {AppContextModule.class})
public interface MyComponent {
void inject(ActivitiesLifeCycleListener obj);
void inject(WebViewManager obj);
Context context();
}
public final class MyClass {
private final WeakReference<Context> mAppContext;
@Inject
public MyClass(Context context) {
this.mAppContext = context
}
}
public class MyActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyClass my = new MyClass(); // The IDE requests context!
}
}
&#34; MyClass的&#34;仍需要&#34; Context&#34;虽然我使用了&#34; @Inject&#34;构造函数上方的注释。 我错过了什么?
我是否需要公开我的上下文?
感谢。
答案 0 :(得分:10)
嗯......你宣布你的构造函数
public MyClass(Context context) {
this.mAppContext = context
}
然后在没有任何参数的情况下调用它
MyClass my = new MyClass(); // The IDE requests context!
为什么你认为这应该有用吗?这是普通的java,没有涉及匕首,你试图在不提供所需参数的情况下创建一些新对象。
Dagger并没有改变java工作原理的魔力。要使用构造函数注入,您必须实际使用Dagger来注入字段。
public class MyActivity extends BaseActivity {
@Inject
MyClass mMyClass; // mark field for injection
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// todo ... create component
component.inject(this); // inject fields
}
}
鉴于您在某处提供Context
(如果不是,您将收到Context must be provided...
编译错误)dagger将通过调用<MyClass
注入您的活动/ strong> inject
- 没有魔法。 inject
方法会将对象分配给您的字段。
构造函数注入仅表示您不必使用模块并包含提供对象的方法。它不仅可以凭空创造物体,也不会改变构造者的工作方式。