Android 匕首2如何执行构造函数注入

Android 匕首2如何执行构造函数注入,android,dagger-2,Android,Dagger 2,我有一节课 public class DialogUtils { private Context context; @Inject public DialogUtils(Context context) { this.context = context; } } 在我的activity类中,我已经这样做了,但我在dialogUtils实例上得到了null指针异常 public class LoginActivity extends Ac

我有一节课

public class DialogUtils
{
    private Context context;

    @Inject
    public DialogUtils(Context context)
    {
        this.context = context;
    }
}
在我的activity类中,我已经这样做了,但我在dialogUtils实例上得到了null指针异常

public class LoginActivity extends Activity{
@Inject DialogUtils dialogUtils;
}

我知道如何通过模块和组件注入依赖项,但不知道如何使用构造注入。非常感谢您的帮助。

一方面,您正在为构造函数注入注册
对话框utils
,因此任何组件都可以提供它

另一方面,活动和Android框架的其他部分仍然需要现场注入。Dagger无法调用其构造函数,并且
@injectdialogutils 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
}

如果您没有保留活动级组件,并且没有使用组件依赖项或子组件从超级作用域(应用程序级组件)继承,则如下所示

// unscoped
public class DialogUtils {
    private final Context context;

    @Inject
    public DialogUtils(Context context) {
        this.context = context;
    }
}
然后

然后

@Inject
DialogUtils dialogUtils;

...


     ActivityComponent activityComponent = DaggerMainActivityComponent.builder()
        .activityModule(new ActivityModule(MainActivity.this))
        .build();

    activityComponent.inject(this); // activityComponent.dialogUtils() also works

谢谢你的回答。在您的示例中,
MyComponent
没有显示与DialogUtils的任何关系。那么调用
component.inject(this)
将如何注入
dialogUtils
变量呢?David,你能为我的问题展示一个完整的解决方案示例吗。另外,构造函数
@的参数如何注入公共对话utils(Context Context){this.Context=Context;}
即Context?或者我如何提供,因为我的类不是一个模块,我只使用构造函数注入。请回复银行。为什么我们还有这两种方法
Context();|DialogUtils DialogUtils()仅当
无效注入时(MainActivity MainActivity)是否可以达到目的?您的方法表明,对于每项活动,我必须制作一个单独的组件和单独的模块?正确或我可以使用一些常用方法对话框需要活动上下文,但不应存储静态活动上下文。不过我可以让它更通用一点。为什么我们有这个方法DialogUtils DialogUtils(),而我们可以通过inject方法在注入之上。谢谢你的解决方案。
@Inject
DialogUtils dialogUtils;

...


     ActivityComponent activityComponent = DaggerMainActivityComponent.builder()
        .activityModule(new ActivityModule(MainActivity.this))
        .build();

    activityComponent.inject(this); // activityComponent.dialogUtils() also works