Как внедрить членов в базовый класс приложения библиотеки? - PullRequest
0 голосов
/ 15 мая 2018

У меня следующая ситуация:

Модуль приложения с классом приложения

public class MainApplication extends CoreApplication implements HasActivityInjector {

    @Inject
    Logger logger;

    @Inject
    DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;


    @Override
    public void onCreate() {
        super.onCreate();


DaggerAppComponent.builder().application(this).build().inject(this);
        logger.log();
    }

    @Override
    public DispatchingAndroidInjector<Activity> activityInjector() {
        return dispatchingAndroidInjector;
    }
}

И CoreApplication определено в другом модуле библиотеки

public class CoreApplication extends Application {

    @Inject
    Logger logger;

    @Override
    public void onCreate() {
        super.onCreate();

        logger.log();
    }
}

Здесь AppComponent.java:

@Singleton
@Component(modules = { AndroidInjectionModule.class, 
ApplicationModule.class})
public interface AppComponent extends AndroidInjector<MainApplication> {

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);
        AppComponent build();
    }
}

Logger предоставляется в модуле приложения в следующем классе

@Module(includes = CoreModule.class)
public abstract class ApplicationModule {

    @Provides
    @Singleton
    static Logger provideLog() {
        return new Logger();
    }
}

Вместо этого в модуле библиотеки определен CoreModule.java:

@Module
public abstract class CoreModule {

    public static final String LOG_TAG = "logTag";

    @ContributesAndroidInjector
    abstract DetailActivity contributeActivityInjector();
}

Проблема в том, что я не могу ввести Logger в CoreApplication (я получаю NPE), но я могу сделать это в MainApplication.

Я могу внедрить его без проблем также в действия основной библиотеки, как это:

public class DetailActivity extends AppCompatActivity {

    @Inject
    Logger logger;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        AndroidInjection.inject(this);

        logger.log();
    }
}

1 Ответ

0 голосов
/ 15 мая 2018

Ваши зависимости вводятся, когда вы звоните inject(this).

Вот почему вы получаете NPE, когда звоните super.oncreate() (а затем logger.log()) до inject().

Переместите super.onCreate() после вызова inject() или еще лучше, переместите код внедрения в базовый класс приложения (CoreApplication).

public abstract class CoreApplication extends Application implements HasActivityInjector {

    @Inject
    Logger logger;

    @Inject
    DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;

    @Override
    public void onCreate() {
        super.onCreate();
        inject();
        logger.log();
    }

    private void inject() {
        DaggerAppComponent
                .builder()
                .application(this)
                .build()
                .inject(this);
    }

    @Override
    public DispatchingAndroidInjector<Activity> activityInjector() {
        return dispatchingAndroidInjector;
    }
}

public class MainApplication extends CoreApplication {

    @Override
    public void onCreate() {
        super.onCreate();
        logger.log();
    }
}
...