簡體   English   中英

Dagger2組件注入多個活動

[英]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 。為什么?

  1. 當使用void inject(MainActivity context); 它的工作正常。 為什么呢

  2. 如果我需要在多個類中注入RetroFit ,應該采用哪種方法。 為每個類創建inject()似乎不是解決方案。

我是依賴注入的新手。 因此,我可以對此進行一些指導嗎? 在多個類中使用它的正確方法是什么?

當您聲明void inject(Context context) Dagger將生成代碼以注入Context 由於Context沒有聲明任何@Inject注釋的字段,因此最終將不會注入任何內容。 這就是注射后您的retrofitnull原因。

當您聲明void inject(MainActivity context) ,它將生成用於注入MainActivity代碼,該代碼還將設置您的retrofit ,因此將對其進行初始化。

匕首將注入父域,但不會注入子域。 您聲明的類是將為其生成代碼的類。

注入對象的默認方式應該是構造器注入 ,而不必手動聲明方法或注入對象。 例如,請參閱此答案以供參考

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM