gpt4 book ai didi

android - Dagger2 - null 而不是注入(inject)的对象

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:02:46 24 4
gpt4 key购买 nike

为了简单起见,假设我想将 Apache 验证器中的 EmailValidator 注入(inject)到我的 Activity 中:

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接口(interface):

@Singleton
@Component(modules = MainModule.class)
public interface MainComponent {

EmailValidator getEmailValidator();
}

当尝试在 Activity 中使用我的验证器时,我遇到了空指针异常:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean org.apache.commons.validator.routines.EmailValidator.isValid(java.lang.String)' on a null object reference

显然我遗漏了一些东西。我知道 dagger 为我创建组件实现。我应该使用它吗?怎么办?

如果我在 onCreate 方法中执行以下操作:

        emailValidator = Dagger_MainComponent.create().getEmailValidator();

然后一切正常。

但我希望能够在任何地方(可能在 setter/constructor 而不是字段上)使用 @Inject 注释。

我错过了什么?

我对 dagger1 做了类似的事情并且它起作用了。当然,我需要在 Activity 中调用 ObjecGraph.inject(this)。什么是 dagger2 等价物?

编辑:

好的,所以我找到了解决方案。如果有人遇到过这样的问题,这里有一些 fragment :

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) 最后,在我想注入(inject)一些组件的 Activity 类中,这两行丑陋得要命:

component = ((EmailSenderApplication) getApplication()).component();
component.inject(this);

最佳答案

看起来你需要构建你的组件:

component = Dagger_ MainComponent.builder()
.mainModule(new MainModule())
.build();

通常,您在应用程序的 onCreate 方法中执行此操作。

一个可能对您有帮助的好资源是 example apps in the Dagger 2 repo .

我还发现此 PR 很有帮助,来自 suggested update to Jake Wharton's u2020 sample app (来自主要的 Dagger 2 工程师)。它很好地概述了从 Dagger 1 到 2 时需要进行的更改,显然这就是 he points people to as well。 .

关于android - Dagger2 - null 而不是注入(inject)的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28724717/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com