无法访问Nullable Dagger2 Android

时间:2017-07-18 11:03:40

标签: android mvp dagger-2 android-mvp

我正在编写一个应用程序,我使用Dagger2进行依赖注入。我是匕首的新手。我对它是如何工作感到困惑,我无法弄清楚如何使用这个库。我曾尝试在博客中使用示例编写下面的模块和组件。我已经提到了该模块的目的。如果我错了,请纠正我。

  1. App Module and Component:它应该在整个应用程序中生成一个单例实例,我想使用这个实例访问一些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);
    
    }
    
  4. 我收到以下错误

      

    错误:无法访问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);
    
    }
    

    为什么我会收到该错误?任何帮助,将不胜感激。提前谢谢。

4 个答案:

答案 0 :(得分:1)

您需要在Component中添加缺少的模块。 例如,如果从下面删除NetModule,则会出现此错误

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

...

答案 1 :(得分:0)

在我的情况下,我有一个带有@Inject注释的构造函数的类,该类扩展了另一个第三方类,该类在方法参数之一上具有@Nullable注释。删除此扩展程序后,一切便开始正常工作。

答案 2 :(得分:0)

万一有人喜欢我。我忘记在Dagger模块中添加@Provides注释。

答案 3 :(得分:0)

在此问题上浪费了大约1天之后,我发现我需要像这样临时添加findbugs依赖项:

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

然后匕首将显示实际错误。