Android Dagger 2 依赖项未被注入
Android Dagger 2 Dependency not being injected
我正在尝试在我的应用程序中使用 Dagger 2,但我在实体存储库方面遇到了一些问题,我还没有弄清楚我缺少什么。
这是我的应用程序组件:
@Singleton
@Component(
modules = {
AndroidModule.class,
RepositoryModule.class
}
)
public interface ApplicationComponent {
void inject(AndroidApplication app);
IDependenceyRepository dependencyRepository();
}
我的模块:
@Module
public class RepositoryModule {
@Provides @Singleton IDependenceyRepository provideDependendencyRepository(Context context) {
return new DependencyRepository(context);
}
}
@Module
public class AndroidModule {
private final AndroidApplication app;
public AndroidModule(AndroidApplication app) {
this.app = app;
}
@Provides @Singleton Context provideApplicationContext() {
return app;
}
}
我的 Android 应用程序:
public class AndroidApplication extends Application {
private ApplicationComponent component;
@Override
public void onCreate() {
super.onCreate();
setupGraph();
}
private void setupGraph() {
component = DaggerApplicationComponent.builder()
.androidModule(new AndroidModule(this))
.repositoryModule(new RepositoryModule())
.build();
component.inject(this);
}
public ApplicationComponent component() {
return component;
}
}
这是我的 activity:
public class MainActivity extends Activity {
@Inject
IDependenceyRepository repository;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.testRepository();
}
private void testRepository() {
Dependency dep = new Dependency();
dep.setDescription("XXX");
dep.setName("AAAA");
try {
repository.save(dep);
Log.d("", repository.queryAll().get(0).getName());
} catch (SQLException e) {
e.printStackTrace();
}
}
我在存储库中收到空指针异常。他没有被注射。
如果我添加这一行:
repository = ((AndroidApplication) getApplication()).component().dependencyRepository();
它有效,但 DI 的意义在于不必担心这个,或者我错了?
我尝试了一些其他示例和教程,但未能解决我的问题。
提前致谢,
david.mihola的评论是正确的:为了能够初始化@Inject字段,您需要在组件中有一个方法(通常void inject(MyClass)
)。
值得注意的是(不是专门针对你的问题,但它可能会出现)如果你有一个基础 class:
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((AndroidApplication) getApplication()).component().inject(this);
}
}
在你的组件中:
void inject(BaseActivity);
注入一个有自己的@Inject 字段的子class不会工作:
public class ActualActivity extends BaseActivity {
@Inject IDependenceyRepository repo;
}
这是因为 Dagger 需要知道将在编译时注入的具体 classes,而不是运行时(就像 Dagger 1 可以做到的那样)。
我正在尝试在我的应用程序中使用 Dagger 2,但我在实体存储库方面遇到了一些问题,我还没有弄清楚我缺少什么。
这是我的应用程序组件:
@Singleton
@Component(
modules = {
AndroidModule.class,
RepositoryModule.class
}
)
public interface ApplicationComponent {
void inject(AndroidApplication app);
IDependenceyRepository dependencyRepository();
}
我的模块:
@Module
public class RepositoryModule {
@Provides @Singleton IDependenceyRepository provideDependendencyRepository(Context context) {
return new DependencyRepository(context);
}
}
@Module
public class AndroidModule {
private final AndroidApplication app;
public AndroidModule(AndroidApplication app) {
this.app = app;
}
@Provides @Singleton Context provideApplicationContext() {
return app;
}
}
我的 Android 应用程序:
public class AndroidApplication extends Application {
private ApplicationComponent component;
@Override
public void onCreate() {
super.onCreate();
setupGraph();
}
private void setupGraph() {
component = DaggerApplicationComponent.builder()
.androidModule(new AndroidModule(this))
.repositoryModule(new RepositoryModule())
.build();
component.inject(this);
}
public ApplicationComponent component() {
return component;
}
}
这是我的 activity:
public class MainActivity extends Activity {
@Inject
IDependenceyRepository repository;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.testRepository();
}
private void testRepository() {
Dependency dep = new Dependency();
dep.setDescription("XXX");
dep.setName("AAAA");
try {
repository.save(dep);
Log.d("", repository.queryAll().get(0).getName());
} catch (SQLException e) {
e.printStackTrace();
}
}
我在存储库中收到空指针异常。他没有被注射。
如果我添加这一行:
repository = ((AndroidApplication) getApplication()).component().dependencyRepository();
它有效,但 DI 的意义在于不必担心这个,或者我错了?
我尝试了一些其他示例和教程,但未能解决我的问题。
提前致谢,
david.mihola的评论是正确的:为了能够初始化@Inject字段,您需要在组件中有一个方法(通常void inject(MyClass)
)。
值得注意的是(不是专门针对你的问题,但它可能会出现)如果你有一个基础 class:
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((AndroidApplication) getApplication()).component().inject(this);
}
}
在你的组件中:
void inject(BaseActivity);
注入一个有自己的@Inject 字段的子class不会工作:
public class ActualActivity extends BaseActivity {
@Inject IDependenceyRepository repo;
}
这是因为 Dagger 需要知道将在编译时注入的具体 classes,而不是运行时(就像 Dagger 1 可以做到的那样)。