Ela*_*adB 5 java android dependency-injection dagger dagger-2
我是匕首的新手,我的构造函数/方法注入似乎不起作用.不起作用意味着仍然请求注入的字段.
这是我的代码:
@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!
}
}
Run Code Online (Sandbox Code Playgroud)
尽管我在构造函数上方使用了"@Inject"注释,但"MyClass"仍然需要"Context".我错过了什么?
我甚至需要公开我的上下文吗?
谢谢.
Dav*_*jak 10
嗯...你声明你的构造函数
public MyClass(Context context) {
this.mAppContext = context
}
Run Code Online (Sandbox Code Playgroud)
然后不带任何参数调用它
MyClass my = new MyClass(); // The IDE requests context!
Run Code Online (Sandbox Code Playgroud)
为什么你认为这应该有效?这是普通的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
}
}
Run Code Online (Sandbox Code Playgroud)
鉴于你提供了Context某个地方(Context must be provided...如果不是,你会得到编译错误),然后dagger将MyClass通过调用 inject -no magic 注入你的活动.该inject方法将对象分配给您的字段.
构造函数注入仅意味着您不必使用模块并包含提供对象的方法.它不仅可以凭空创造物体,也不会改变构造者的工作方式.
| 归档时间: |
|
| 查看次数: |
3688 次 |
| 最近记录: |