[英]Dagger 2 on Android @Singleton annotated class not being injected
[英]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;
}
}
我的AndroidApplication:
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;
}
}
这是我的活动:
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)
)。
值得注意的是(如果你有一个基类,不是专门针对你的问题,但它可能会出现):
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((AndroidApplication) getApplication()).component().inject(this);
}
}
在您的组件中:
void inject(BaseActivity);
注入具有它自己的@Inject字段的子类将不起作用:
public class ActualActivity extends BaseActivity {
@Inject IDependenceyRepository repo;
}
这是因为Dagger需要知道将在编译时注入的具体类,而不是运行时(如Dagger 1可以做到的)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.