为简单起见,假设我想将apache验证器中的EmailValidator注入我的活动中:
public class MainActivity extends FragmentActivity {
@Inject
EmailValidator emailValidator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
我有一个MainModule类:
@Module
public class MainModule {
@Provides
public EmailValidator providesEmailValidator() {
return EmailValidator.getInstance();
}
}
和MainComponent接口:
@Singleton
@Component(modules = MainModule.class)
public interface MainComponent {
EmailValidator getEmailValidator();
}
当尝试在活动中使用我的验证器时,我得到一个nullpointer异常:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean org.apache.commons.validator.routines.EmailValidator.isValid(java.lang.String)' on a null object reference
显然我错过了一些东西。我知道匕首为我创建了组件实现。我应该用吗?怎么样?
如果我在onCreate方法中执行以下操作:
emailValidator = Dagger_MainComponent.create().getEmailValidator();
然后一切正常。
但是我希望能够在任何地方使用@Inject注释(可能在setter / constructor而不是字段上)。
我缺少什么?
我用dagger1做了类似的事情,但它确实奏效了。当然,我需要在活动中致电ObjecGraph.inject(this)
。什么是dagger2等价物?
修改
好的,所以我找到了解决方案。如果有人遇到这样的问题,可以使用一些片段:
1)我创建了一个应用程序类:
public class EmailSenderApplication extends Application {
private MainComponent component;
@Override
public void onCreate() {
super.onCreate();
component = Dagger_MainComponent
.create();
component.inject(this);
}
public MainComponent component() {
return component;
}
}
2)在AndroidManifest.xml中:
<application
android:name=".EmailSenderApplication"
...
3)最后,在活动类中,我想注入一些组件,这两个组成丑陋的地狱线:
component = ((EmailSenderApplication) getApplication()).component();
component.inject(this);
答案 0 :(得分:12)
您需要按照以下方式构建组件:
component = Dagger_ MainComponent.builder()
.mainModule(new MainModule())
.build();
通常,您可以在应用程序的onCreate
方法中执行此操作。
可以帮助您的一个好资源是example apps in the Dagger 2 repo。
我还从suggested update to Jake Wharton's u2020 sample app(来自主Dagger 2工程师)发现这个PR有用。它很好地概述了从Dagger 1到2时需要做出的改变,显然那是he points people to as well。