Внедрение компонента Dagger2 для нескольких операций - PullRequest
0 голосов
/ 01 июня 2018

Это кажется очень простым вопросом для 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. Почему?

При использовании void inject(MainActivity context); работает нормально.Почему?

Если мне нужно ввести RetroFit в несколько классов, какой подход должен быть.Создание inject() для каждого класса не кажется решением.

Я новичок в инъекциях зависимости.Так что я могу иметь некоторое руководство на это.Какой будет правильный подход, чтобы использовать его в нескольких классах.

1 Ответ

0 голосов
/ 01 июня 2018

Когда вы объявляете void inject(Context context) Dagger сгенерирует код для внедрения Context.Поскольку Context не объявляет какие-либо аннотированные поля @Inject, это ничего не даст.Вот почему ваш retrofit равен null после внедрения.

Когда вы объявляете void inject(MainActivity context), он сгенерирует код для ввода MainActivity, который также установит ваш retrofit, поэтому он будет инициализирован.

Кинжал будет вставлять родительские поля, но не дочерние.Класс, который вы объявляете, - это тот, для которого будет сгенерирован код.

Ваш способ внедрения объектов по умолчанию должен быть Конструктор Injection , где вам не нужно вручную объявлять методы или вводитьобъекты.например, см. этот ответ для справки .

...