我正在编写一个应用程序,我使用Dagger2进行依赖注入。我是匕首的新手。我对它是如何工作感到困惑,我无法弄清楚如何使用这个库。我曾尝试在博客中使用示例编写下面的模块和组件。我已经提到了该模块的目的。如果我错了,请纠正我。
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();
}
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);
}
为什么我会收到该错误?任何帮助,将不胜感激。提前谢谢。
答案 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'
然后匕首将显示实际错误。