【问题标题】:Cannot access Nullable Dagger2 Android无法访问 Nullable Dagger2 Android
【发布时间】:2017-07-18 11:03:40
【问题描述】:

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

  1. App 模块和组件:它应该在整个应用程序中生成一个单例实例,我想使用这个实例来访问一些 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);

}

为什么会出现这个错误?任何帮助,将不胜感激。提前致谢。

【问题讨论】:

  • 缺少一些代码片段。编译或执行时是否出错?
  • 我在编译期间得到它,即当我在 android studio 中单击运行应用程序时

标签: android mvp dagger-2 android-mvp


【解决方案1】:

您需要在组件中添加缺少的模块.. 例如,如果您从下面删除 NetModule,您将收到此错误

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

...

【讨论】:

    【解决方案2】:

    以防有人像我一样。我忘记在 Dagger 模块中添加 @Provides 注释。

    【讨论】:

      【解决方案3】:

      在我的例子中,我有一个带有 @Inject 注释构造函数的类,它扩展了另一个在方法参数之一上有 @Nullable 注释的第 3 方类。一旦我删除了这个扩展,一切都开始正常工作了。

      【讨论】:

        【解决方案4】:

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

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

        然后 dagger 会打印出实际的错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-25
          相关资源
          最近更新 更多