Dagger2 为多个活动注入组件



对于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;
}
}

和主要活动.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);时,我在MainActivityretrofit上得到了NullPointerException。为什么?

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

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

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

当你声明void inject(Context context)Dagger 将生成代码以注入Context.由于Context没有声明任何@Inject注释字段,因此最终不会注入任何内容。这就是为什么注射后retrofitnull的原因。

当你声明void inject(MainActivity context)时,它将生成代码来注入MainActivity,这也将设置你的retrofit,因此它将被初始化。

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

注入对象的默认方式应该是构造函数注入,您不必手动声明方法或注入对象。 例如,请参阅此答案以供参考。

最新更新