我有以下情况:
应用程序模块,应用程序类
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();
}
}
答案 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();
}
}