Dagger 2如何执行构造函数注入

时间:2017-07-19 14:00:11

标签: android dagger-2

我有一个班级

public class DialogUtils
{
    private Context context;

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

在我的活动类中,我已经做了但是我在dialogUtils实例上获得了空指针异常。

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

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

2 个答案:

答案 0 :(得分:4)

如果您没有保留活动级别组件,并且您没有使用组件依赖关系或子组件继承超级作用域(应用程序级组件),那么它是以下

// 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

答案 1 :(得分:2)

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

另一方面,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
}