如何在库的基础应用程序 class 中注入成员?

How to inject members in a base Application class of a library?

我有以下情况:

一个应用程序模块,带有应用程序class

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是在下面的app模块中提供的class

@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();
}

问题是我无法在 CoreApplication 中注入 Logger(我得到一个 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();
    }
}

当您调用 inject(this) 时,您的依赖项将被注入。

这就是为什么在 inject().

之前调用 super.oncreate()(随后调用 logger.log())时会出现 NPE 的原因

inject() 调用之后移动 super.onCreate() 或者更好的是,将注入代码移动到您的基础应用 class (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();
    }
}