DispatchingActivityInjector возвращает ноль
Хорошо, так что я долго бился над этим. Мое приложение почти сразу перестало работать из-за NPE на AndroidInjection.inject(this) в моей деятельности... Появляется проблема, что DispatchingActivityInjector (injected) возвращает значение NULL, но я не знаю, где я ошибся.
В любом случае, вот все мои вещи DI:
Appcomponent:
@Component(modules = {
ImageCaptureModule.class,
InjectorsModule.class
})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
void inject(Application application);
}
AppModule:
@Module
public class AppModule {
private Context context;
public AppModule(@NonNull Application application) {
this.context = application;
}
}
InjectorModule:
@Module(includes = AndroidSupportInjectionModule.class)
public abstract class InjectorsModule {
@ActivityScope
@ContributesAndroidInjector(modules = {ImageCaptureModule.class})
abstract ImageCaptureActivity contributeImageCaptureActivity();
}
ImageCaptureModule:
@Module
public abstract class ImageCaptureModule {}
Заявка:
@Inject DispatchingAndroidInjector<Activity> dispatchingActivityInjector;
@Override
public void onCreate() {
DaggerAppComponent.builder().application(this).build().inject(this);
super.onCreate();
}
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingActivityInjector;
}
Деятельность:
public class ImageCaptureActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
AndroidInjection.inject(this); // this is where the failure occurs
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_capture);
ImageCaptureViewModel viewModel = ViewModelProviders.of(this, super.viewModelFactory).get(ImageCaptureViewModel.class);
}
}
Вот трассировка стека:
java.lang.RuntimeException: Unable to start activity ComponentInfo{ImageCaptureActivity}: java.lang.NullPointerException: mApplication.activityInjector() returned null
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2421)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
at android.app.ActivityThread.access$900(ActivityThread.java:155)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:174)
at android.app.ActivityThread.main(ActivityThread.java:5440)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Application.activityInjector() returned null
at dagger.internal.Preconditions.checkNotNull(Preconditions.java:83)
at dagger.android.AndroidInjection.inject(AndroidInjection.java:57)
at ImageCaptureActivity.onCreate(ImageCaptureActivity.java:15)
at android.app.Activity.performCreate(Activity.java:6285)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2374)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
at android.app.ActivityThread.access$900(ActivityThread.java:155)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:174)
at android.app.ActivityThread.main(ActivityThread.java:5440)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
2 ответа
Я тоже долго бился над этим
ваш
@Component(modules = {
ImageCaptureModule.class,
InjectorsModule.class
})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
void inject(Application application);
}
вместо этого добавьте изменение класса приложения, чтобы добавить класс приложения (например, TestApplication)
@Component(modules = {
ImageCaptureModule.class,
InjectorsModule.class
})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
void inject(**TestApplication** application);
}
Итак, я немного переключился в раздел DI приложения, чтобы исправить ошибку, и в случае, если кто-нибудь столкнется с этой же проблемой, это то, что мне помогло (хорошо, как в Dagger 2.14.1)
@Component(modules = {
InjectorsModule.class,
ImageCaptureModule.class,
AndroidInjectionModule.class
})
public interface AppComponent extends AndroidInjector<MyApplication> {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
void inject(Application application);
}
AppModule:
@Module
public class AppModule {
private Context context;
public AppModule(@NonNull Application application) {
this.context = application;
}
@Provides
@Singleton
Context provideContext() {
return context;
}
@Provides
@Singleton
CameraManager provideCameraManager() {
return new CameraManager();
}
}
Инжекторы деятельности:
@Module(includes = AndroidInjectionModule.class)
public abstract class InjectorsModule {
@ContributesAndroidInjector(modules = {ImageCaptureModule.class})
@ActivityScope
abstract ImageCaptureActivity contributeImageCaptureActivity();
}
ImageCaptureModule:
@Module
public abstract class ImageCaptureModule {}