Dagger2组件注入多个活动

时间:2018-06-01 09:37:23

标签: java android dagger-2

对于Dagger2用户来说,这似乎是一个非常基本的问题。我最近开始使用RetroFit进行探索。我已经按照一些教程编写了下面的代码(其中一些)。

    @Singleton
    @Component(modules = {AppModule.class, ApiModule.class})
     public interface ApiComponent {
    void inject(MainActivity context);
     }


    public class MyApplication extends Application {
    private ApiComponent mApiComponent;
    @Override
    public void onCreate() {
        super.onCreate();
        mApiComponent = DaggerApiComponent.builder()
                .appModule(new AppModule(this))
                .apiModule(new ApiModule("https://rect.otp/demos/"))
                .build();
    }
    public ApiComponent getNetComponent() {
        return mApiComponent;
    }
   }

和MainActivity.java

public class MainActivity extends AppCompatActivity {
@Inject
Retrofit retrofit;
ActivityMainBinding mainBinding;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    ((MyApplication) getApplication()).getNetComponent().inject(this);
    ApiCall api = retrofit.create(ApiCall.class);
}
}

问题
1.当我将void inject(MainActivity context);更改为void inject(Context context);时,我在NullPointerException retrofit上获得了MainActivity。为什么?

  1. 使用void inject(MainActivity context);时工作正常。为什么?

  2. 如果我需要在多个类中注入RetroFit应该是什么方法。为每个类创建inject()似乎不是解决方案。

  3. 我是依赖注射的新手。我可以对它有一些指导。在多个类中使用它的正确方法是什么。

1 个答案:

答案 0 :(得分:4)

当您声明void inject(Context context)时,Dagger会生成注入Context的代码。由于Context未声明任何@Inject注释字段,因此最终不会注入任何内容。这就是注射后retrofitnull的原因。

当您声明void inject(MainActivity context)时,它会生成注入MainActivity的代码,该代码也会设置您的retrofit,因此会初始化。

Dagger将注入父字段,但不会注入子字段。您声明的类是将为其生成代码的类。

注入对象的默认方式应该是构造函数注入,您不必手动声明方法或注入对象。例如见this answer for reference