Невозможно получить доступ к Nullable Dagger2 Android
Я пишу приложение, в котором я использую Dagger2 для внедрения зависимостей. Я новичок в кинжале. Я запутался в том, как это работает, и я не могу понять, как использовать эту библиотеку. Я попытался написать ниже модули и компоненты с помощью примеров в блогах. Я упомянул цель этого модуля. Пожалуйста, поправьте меня, если я ошибаюсь.
Модуль и компонент приложения: он должен генерировать единичный экземпляр во всем приложении, и я хочу использовать этот экземпляр для доступа к некоторым ресурсам 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(); }
Создание 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; } }
Приведенный выше код работает нормально. У меня проблемы с кодом ниже
Модуль и компонент местоположения: это нормально, если у меня нет конструктора для модуля ниже?
@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);
}
Почему я получаю эту ошибку? Любая помощь будет оценена. Заранее спасибо.
2 ответа
Вам нужно добавить отсутствующие модули в ваш компонент. Например, вы получите эту ошибку, если вы удалите NetModule снизу
@Component(modules = {AppModule.class, NetModule.class, MainModule.class})
public interface AppComponent {
...
На случай, если кто-то вроде меня там. Я забыл добавить@Provides
аннотация к модулю Dagger.
В моем случае у меня был класс с @Inject
аннотированный конструктор, который расширил еще один сторонний класс, который имел @Nullable
аннотация по одному из параметров метода. Как только я удалил это расширение, все стало работать нормально.
Потратив около 1 дня на эту проблему, я обнаружил, что мне нужно временно добавить findbugs
зависимость вроде этой:
implementation 'com.google.code.findbugs:jsr305:3.0.2'
Затем кинжал напечатает фактическую ошибку.