Не удается получить доступ к Nullable Dagger2 Android

Я пишу приложение, в котором использую Dagger2 для внедрения зависимостей. Я новичок в кинжале. Я запутался в том, как это работает, и я не могу понять, как использовать эту библиотеку. Я пробовал писать ниже модули и компоненты с помощью примеров в блогах. Я упомянул цель этого модуля. Пожалуйста, поправьте меня, если я ошибаюсь.

  1. Модуль и компонент приложения: он должен генерировать одноэлементный экземпляр в приложении, и я хочу использовать этот экземпляр для доступа к некоторым ресурсам Android.

    @Module
    public class AppModule {
    
    private BaseApplication baseApplication;
    
    public AppModule(BaseApplication baseApplication){
        this.baseApplication = baseApplication;
    }
    
    @Provides
    @Singleton
    BaseApplication providesApplication(){
        return baseApplication;
    }
    }
    
    @Singleton
    @Component(modules = {AppModule.class})
    public interface AppComponent {
    BaseApplication getBaseApplication();
    }
    
  2. Создание AppComponent

    public class BaseApplication extends Application {
    
    private AppComponent appComponent;
    
    @Override
    public void onCreate() {
        super.onCreate();
    
        appComponent = DaggerAppComponent.builder().appModule(new 
    AppModule(this)).build();
    }
    
    public AppComponent getAppComponent(){
        return appComponent;
    }
    }
    

    Приведенный выше код работает нормально. Я получаю проблемы в приведенном ниже коде

  3. Модуль и компонент местоположения: все в порядке, если у меня нет конструктора для модуля ниже?

    @Module
    public class LocationModule {
    
    @IntDef(
            {LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY,
             LocationRequest.PRIORITY_HIGH_ACCURACY,
             LocationRequest.PRIORITY_LOW_POWER,
             LocationRequest.PRIORITY_NO_POWER})
    @Retention(RetentionPolicy.SOURCE)
    public @interface LocationPriority {}
    
    @Provides
    @Singleton
    @Named("default")
    LocationRequest providesLocationRequest(){
        return new LocationRequest()
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                .setInterval(Constants.LOCATION_UPDATE_INTERVAL_MS)
    
    .setFastestInterval(Constants.LOCATION_UPDATE_FASTEST_INTERVAL_MS)
    
    .setSmallestDisplacement(Constants.LOCATION_UPDATE_DISPLACEMENT_METERS);
    }
    
    @Provides
    @Singleton
    @Named("custom")
    LocationRequest providesCustomLocationRequest(int interval, int 
    fastestInterval, @LocationPriority int priority, float updateDisplacement) {
        return new LocationRequest()
                .setPriority(priority)
                .setInterval(interval)
                .setFastestInterval(fastestInterval)
                .setSmallestDisplacement(updateDisplacement);
    }
    
    @Provides
    @Singleton
    LocationSettingsRequest providesLocationSettingsRequest(LocationRequest 
    locationRequest){
         return new LocationSettingsRequest.Builder()
                 .addLocationRequest(locationRequest)
                 .build();
    }
    
    @Provides
    @Singleton
    FusedLocationProviderClient providesFusedLocationClient(BaseApplication 
    baseApplication){
        return LocationServices.getFusedLocationProviderClient(baseApplication);
    }
    
    @Provides
    @Singleton
    SettingsClient providesSettingsClient(BaseApplication baseApplication){
        return LocationServices.getSettingsClient(baseApplication);
    }
    }
    
    
    @Singleton
    @Component(modules = {LocationModule.class, AppModule.class})
    public interface LocationComponent {
    
    **Do we Really need a method here?**
    void inject(GetLocationUseCase getLocationUseCase);
    
    }
    

Я получаю следующую ошибку

ошибка: не удается получить доступ к файлу класса Nullable для javax.annotation.Nullable не найден

после использования @Inject в классе ниже. Если я удалю @Inject, ошибка исчезнет.

public final class GetLocationUseCase implements 
UseCaseContract.BusinessLogic {


UseCaseContract.Mediator mediator;

@Inject
FusedLocationProviderClient fusedLocationProviderClientl;

@Override
public void onInitialize() {

    BaseApplication application = mediator.requestUserContext();

    DaggerLocationComponent.builder().appModule(new 
AppModule(application)).locationModule(new 
LocationModule()).build().inject(this);

}

Почему я получаю эту ошибку? Любая помощь будет оценена по достоинству. Заранее спасибо.


person nithesh1990    schedule 18.07.2017    source источник
comment
Отсутствует фрагмент кода. Вы получаете ошибку при компиляции или при выполнении?   -  person Jileshl    schedule 18.07.2017
comment
Я получаю его во время компиляции, т.е. когда я нажимаю «Запустить приложение» в студии Android.   -  person nithesh1990    schedule 18.07.2017


Ответы (4)


Вам нужно добавить недостающие модули в свой компонент. Например, вы получите эту ошибку, если удалите NetModule снизу

@Component(modules = {AppModule.class, NetModule.class, MainModule.class})
public interface AppComponent {

...

person Max    schedule 01.09.2017

На случай, если кто-то вроде меня там. Я забыл добавить аннотацию @Provides к модулю Dagger.

person zoha131    schedule 24.11.2019

В моем случае у меня был класс с аннотированным конструктором @Inject, который расширял другой сторонний класс, который имел аннотацию @Nullable для одного из параметров метода. Как только я удалил это расширение, все стало нормально работать.

person Ernest Zamelczyk    schedule 06.11.2018

Потратив около 1 дня на эту проблему, я обнаружил, что мне нужно временно добавить зависимость findbugs следующим образом:

implementation 'com.google.code.findbugs:jsr305:3.0.2'

Затем кинжал напечатает фактическую ошибку.

person Hassan TBT    schedule 11.05.2020