Dagger 2 如何执行构造函数注入
Dagger 2 how to perform constructor injection
我有一个class
public class DialogUtils
{
private Context context;
@Inject
public DialogUtils(Context context)
{
this.context = context;
}
}
在我的 activity class 中,我已经这样做了,但是我在 dialogUtils 实例上遇到了空指针异常。
public class LoginActivity extends Activity{
@Inject DialogUtils dialogUtils;
}
我知道如何通过模块和组件注入依赖,但不确定如何使用构造注入。非常感谢任何帮助。
一方面,您正在注册 DialogUtils
构造函数注入,因此任何组件都可以提供它。
另一方面,activity 和 Android 框架的其他部分仍然需要现场注入。 Dagger不能调用它们的构造函数,而且@Inject DialogUtils dialogUtils;
不会神奇地出现。
这里你必须使用一个组件,并注册一个将你的组件类型作为参数的方法。然后 Dagger 将创建注入您的活动字段的方法。
@Component MyComponent {
inject(LoginActivity activity);
}
要注入字段,您仍然需要创建组件,并调用 inject(loginActivity)
方法。
void onCreate(...) {
MyComponent component = // create the component
// dagger does some heavy lifting here
component.inject(this);
dialogUtils.doSomething(); // not null, we just injected our fields
}
如果您不保留 activity 级组件并且您没有使用组件依赖项或子组件从超级作用域(应用程序级组件)继承,则如下
// unscoped
public class DialogUtils {
private final Context context;
@Inject
public DialogUtils(Context context) {
this.context = context;
}
}
然后
@Module
public class ActivityModule {
private final Context context;
public ActivityModule (Context context) {
this.context = context;
}
@Provides //scope is not necessary for parameters stored within the module
public Context context() {
return context;
}
}
@Component(modules={ActivityModule.class})
@Singleton
public interface ActivityComponent {
Context context();
DialogUtils dialogUtils();
void inject(MainActivity mainActivity);
}
然后
@Inject
DialogUtils dialogUtils;
...
ActivityComponent activityComponent = DaggerMainActivityComponent.builder()
.activityModule(new ActivityModule(MainActivity.this))
.build();
activityComponent.inject(this); // activityComponent.dialogUtils() also works
我有一个class
public class DialogUtils
{
private Context context;
@Inject
public DialogUtils(Context context)
{
this.context = context;
}
}
在我的 activity class 中,我已经这样做了,但是我在 dialogUtils 实例上遇到了空指针异常。
public class LoginActivity extends Activity{
@Inject DialogUtils dialogUtils;
}
我知道如何通过模块和组件注入依赖,但不确定如何使用构造注入。非常感谢任何帮助。
一方面,您正在注册 DialogUtils
构造函数注入,因此任何组件都可以提供它。
另一方面,activity 和 Android 框架的其他部分仍然需要现场注入。 Dagger不能调用它们的构造函数,而且@Inject DialogUtils dialogUtils;
不会神奇地出现。
这里你必须使用一个组件,并注册一个将你的组件类型作为参数的方法。然后 Dagger 将创建注入您的活动字段的方法。
@Component MyComponent {
inject(LoginActivity activity);
}
要注入字段,您仍然需要创建组件,并调用 inject(loginActivity)
方法。
void onCreate(...) {
MyComponent component = // create the component
// dagger does some heavy lifting here
component.inject(this);
dialogUtils.doSomething(); // not null, we just injected our fields
}
如果您不保留 activity 级组件并且您没有使用组件依赖项或子组件从超级作用域(应用程序级组件)继承,则如下
// unscoped
public class DialogUtils {
private final Context context;
@Inject
public DialogUtils(Context context) {
this.context = context;
}
}
然后
@Module
public class ActivityModule {
private final Context context;
public ActivityModule (Context context) {
this.context = context;
}
@Provides //scope is not necessary for parameters stored within the module
public Context context() {
return context;
}
}
@Component(modules={ActivityModule.class})
@Singleton
public interface ActivityComponent {
Context context();
DialogUtils dialogUtils();
void inject(MainActivity mainActivity);
}
然后
@Inject
DialogUtils dialogUtils;
...
ActivityComponent activityComponent = DaggerMainActivityComponent.builder()
.activityModule(new ActivityModule(MainActivity.this))
.build();
activityComponent.inject(this); // activityComponent.dialogUtils() also works