Кинжал-2: поле не закачано - PullRequest
0 голосов
/ 08 марта 2019

Мое поле для дооснащения в этом классе никогда не вводится, оно по-прежнему равно нулю, когда я запускаю свой код.

Вот мой ServiceClass, в который я внедряю дооснащение, получаю вызовы API и т. Д. Я удалил егодля простоты:

public class ServiceClass{

    @Inject
    Retrofit retrofit;

    public ServiceClass(){
    }

}

Мой класс модуля для всех зависимостей, связанных с сетью:

@Module
public class NetworkModule {

    @Provides
    @ApplicationScope
    Retrofit getRetrofit(OkHttpClient okHttpClient, Gson gson){
        return new Retrofit.Builder()
                .baseUrl(URL.BASE_URL)
                .client(okHttpClient)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
    }

    @Provides
    @ApplicationScope
    OkHttpClient getOkHttpClient(Gson gson, HttpLoggingInterceptor httpLoggingInterceptor){
        OkHttpClient okHttpClient = new OkHttpClient();
        okHttpClient.newBuilder().addInterceptor(httpLoggingInterceptor);
        return okHttpClient;
    }

    @Provides
    @ApplicationScope
    HttpLoggingInterceptor getHttpLoggingInterceptor(){
        return new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC);
    }

    @Provides
    @ApplicationScope
    Gson getGson(){
        return new Gson();
    }

}

Мой AppComponent, это мой единственный класс компонента:

@ApplicationScope
@Component(modules = {NetworkModule.class})
public interface AppComponent {

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(MyApplication myApplication);
        AppComponent build();
    }

    void inject(MyApplication myApplication);

    Retrofit getRetrofit();
}

Мое приложениекласс:

public class MyApplication extends Application{

    private AppComponent appComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        DaggerAppComponent
                .builder()
                .application(this)
                .build()
                .inject(this);
    }

    public AppComponent getAppComponent(){
        return appComponent;
    }

}

Я попытался поиграться с кодом, мне не удается заставить его работать должным образом.Что мне здесь не хватает?

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Существует несколько способов введения retrofit в ServiceClass

  1. Вы должны сделать отдельный Component для ServiceClass, например: -

    @Component(dependencies = AppComponent.class)
    interface ServiceClassComponent {
       void injectServiceClass(ServiceClass serviceClass);
    }
    

Или

вы можете просто вставить ServiceClass в компонент приложения: -

void injectServiceClass(ServiceClass serviceClass);

в ключевое слово AppComponent

dependenciesбудет включать в себя все зависимые компоненты в ваш конкретный компонент, который вы будете строить.

Затем в конструкторе ServiceClass вам нужно построить Компонент и внедрить его

1 голос
/ 08 марта 2019

Обновление (предыдущая информация все еще действительна):

Я заметил, что вы неправильно создали свой компонент: вы должны добавить .networkModule(new NetworkModule()) после DaggerAppComponent.builder() Убедитесь, что ваш private AppComponent appComponent также инициализирован!


Для внедрения в поле (я полагаю, это то, что вам нужно), вы можете написать свой конструктор так:

public ServiceClass(){
    MyApplication.getInstance().getAppComponent().inject(this)
}

Естественно, вы должны как-то выставить вашу сущность appComponent - выше мойдогадка (чтобы раскрыть сущность appComponent через сущность приложения).

PS .: лучший подход (и более читаемый тоже) состоит в том, чтобы вообще избегать внедрения полей и параметризировать конструктор (однако это не всегда возможно, как, например, если выВнедрить в деятельность).

PSS .: ваш компонент приложения также должен иметь void inject(ServiceClass value);

...