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

时间:2018-05-15 14:50:03

标签: android dagger-2 android-library

我有以下情况:

应用程序模块,应用程序类

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模块中提供的
@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();
    }
}

1 个答案:

答案 0 :(得分:0)

当您致电inject(this)时,会注入您的相关性。

这就是为什么在super.oncreate()之前致电logger.log()(以及随后inject())时获得NPE的原因。

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