Android Dagger 2 Dependency没有被注入
我正在尝试将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(); } }
会发生什么是我在存储库中得到一个空指针exception。 他没有被注射。
如果我添加此行:
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可以做到的)。