gpt4 book ai didi

java - Dagger 在注入(inject)嵌套依赖项时抛出 IllegalStateException

转载 作者:行者123 更新时间:2023-11-29 05:09:06 25 4
gpt4 key购买 nike

我想注入(inject)具有嵌套依赖关系的 Activity 对象。所有依赖项都由 Dagger 模块管理。

我已经尝试用三种不同的方式来做到这一点。对我来说最好的方法是第三种方法,它实际上会抛出一个我不完全理解的错误。

您能解释一下为什么第三种方法不起作用吗?

public class Bar {
public void bar() {
Log.i("Bar", "bar");
}
}

public class MainActivity extends Activity {

@Inject
Foo foo;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ObjectGraph.create(new MainModule()).inject(this);
ButterKnife.inject(this);
}

@OnClick(R.id.button)
void onButtonClick() {
foo.foo();
}
}

第一种方法有效 - Foo 是接口(interface)的实现:

public interface IFoo {
public void foo();
}

public class Foo implements IFoo{

@Inject
Bar bar;

@Override
public void foo() {
bar.bar();
}
}

@Module(injects = MainActivity.class, library = true)
public class MainModule {

@Provides
@Singleton
Bar provideBar() {
return new Bar();
}

@Provides
@Singleton
IFoo provideFoo(Foo foo) {
return foo;
}

}

第二种方法有效 - Foo 是普通类,但模块不包含它:

public class Foo {

@Inject
Bar bar;

public void foo() {
bar.bar();
}
}

@Module(injects = MainActivity.class)
public class MainModule {

@Provides
@Singleton
Bar provideBar() {
return new Bar();
}

}

第三种方法抛出错误 - Foo 是普通类并且模块包含它:

Error:(12, 8) error: Unknown error java.lang.IllegalStateException thrown by javac in graph validation: Dependency cycle:
0. foo.Foo bound by @Singleton/ProvidesBinding[key=foo.Foo method=foo.MainModule.provideFoo()
0. foo.Foo

public class Foo {

@Inject
Bar bar;

public void foo() {
bar.bar();
}
}

@Module(injects = MainActivity.class, library = true)
public class MainModule {

@Provides
@Singleton
Bar provideBar() {
return new Bar();
}

@Provides
@Singleton
Foo provideFoo(Foo foo) {
return foo;
}

}

最佳答案

这个提供者方法创建了一个循环:

@Provides
@Singleton
Foo provideFoo(Foo foo) {
return foo;
}

您需要 Foo 的实例来创建 Foo 的实例,因此您永远无法获得实例。

建议的解决方案:

public class Foo {

private final Bar bar;

@Inject
public Foo(Bar bar) {
this.bar = bar;
}

public void foo() {
bar.bar();
}
}

@Module(injects = MainActivity.class, library = true)
public class MainModule {

@Provides
@Singleton
Bar provideBar() {
return new Bar();
}

@Provides
@Singleton
Foo provideFoo(Bar bar) {
return new Foo(bar);
}

}

关于java - Dagger 在注入(inject)嵌套依赖项时抛出 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29310610/

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