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 {}
Другие вопросы по тегам