[英]Dagger2 Component inject for multiple Activities
對於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);
我在MainActivity
進行retrofit
時得到了NullPointerException
。為什么?
當使用void inject(MainActivity context);
它的工作正常。 為什么呢
如果我需要在多個類中注入RetroFit
,應該采用哪種方法。 為每個類創建inject()
似乎不是解決方案。
我是依賴注入的新手。 因此,我可以對此進行一些指導嗎? 在多個類中使用它的正確方法是什么?
當您聲明void inject(Context context)
Dagger將生成代碼以注入Context
。 由於Context
沒有聲明任何@Inject
注釋的字段,因此最終將不會注入任何內容。 這就是注射后您的retrofit
為null
原因。
當您聲明void inject(MainActivity context)
,它將生成用於注入MainActivity
代碼,該代碼還將設置您的retrofit
,因此將對其進行初始化。
匕首將注入父域,但不會注入子域。 您聲明的類是將為其生成代碼的類。
注入對象的默認方式應該是構造器注入 ,而不必手動聲明方法或注入對象。 例如,請參閱此答案以供參考 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.