Dagger2 发现依赖循环 Android
Dagger2 Found Dependency Cycle Android
我是 Dagger2 的新手,我遇到了需要在模块中同时使用 @Provides 和 @Binds 的问题。但它给出错误
[Dagger/DependencyCycle] Found a dependency cycle:
public interface CarComponent{
^
com.stupido.daggertutorial.Engine is injected at
com.stupido.daggertutorial.CarModule.bindsEngine(arg0)
com.stupido.daggertutorial.Engine is injected at
com.stupido.daggertutorial.CarModule.providesCar(engine, …)
com.stupido.daggertutorial.Car is requested at
com.stupido.daggertutorial.CarComponent.getCar()
在我使用@Provides 之前它工作正常但结合使用我遇到了上述问题。
组件
@Component(modules = CarModule.class)
public interface CarComponent{
//constructor injection
Car getCar();
}
模块
@Module
public abstract class CarModule {
@Binds
abstract Wheels bindsWheels(Wheels wheels);
@Binds
abstract Engine bindsEngine(Engine engine);
@Provides
static Car providesCar(Engine engine,Wheels wheels){
return new Car(wheels,engine);
}
}
Activity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CarComponent carComponent = DaggerCarComponent.create();
Car car = carComponent.getCar();
}
}
您使用 @Binds
的方式有误。请阅读他们的文档。
@Binds 方法:
必须有一个参数,其类型可分配给 return 类型。 return 类型声明绑定类型(就像 @Provides 方法一样),参数是它绑定到的类型。
您必须将@Binds 更改为@Provides。
@Binds
通常适用于您有一些继承的 class 及其接口并且您希望 dagger 知道这一点并能够注入接口的情况。通常你会
@Binds
abstract Engine bindsEngine(DieselEngine dieselEngine);
然后你可以在不知道实现细节的情况下注入发动机(它是柴油发动机)。
在你的情况下,如果你删除这两个 @Binds
方法,它应该开始工作(如果没有其他问题)。
我是 Dagger2 的新手,我遇到了需要在模块中同时使用 @Provides 和 @Binds 的问题。但它给出错误
[Dagger/DependencyCycle] Found a dependency cycle:
public interface CarComponent{
^
com.stupido.daggertutorial.Engine is injected at
com.stupido.daggertutorial.CarModule.bindsEngine(arg0)
com.stupido.daggertutorial.Engine is injected at
com.stupido.daggertutorial.CarModule.providesCar(engine, …)
com.stupido.daggertutorial.Car is requested at
com.stupido.daggertutorial.CarComponent.getCar()
在我使用@Provides 之前它工作正常但结合使用我遇到了上述问题。
组件
@Component(modules = CarModule.class)
public interface CarComponent{
//constructor injection
Car getCar();
}
模块
@Module
public abstract class CarModule {
@Binds
abstract Wheels bindsWheels(Wheels wheels);
@Binds
abstract Engine bindsEngine(Engine engine);
@Provides
static Car providesCar(Engine engine,Wheels wheels){
return new Car(wheels,engine);
}
}
Activity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CarComponent carComponent = DaggerCarComponent.create();
Car car = carComponent.getCar();
}
}
您使用 @Binds
的方式有误。请阅读他们的文档。
@Binds 方法:
必须有一个参数,其类型可分配给 return 类型。 return 类型声明绑定类型(就像 @Provides 方法一样),参数是它绑定到的类型。
您必须将@Binds 更改为@Provides。
@Binds
通常适用于您有一些继承的 class 及其接口并且您希望 dagger 知道这一点并能够注入接口的情况。通常你会
@Binds
abstract Engine bindsEngine(DieselEngine dieselEngine);
然后你可以在不知道实现细节的情况下注入发动机(它是柴油发动机)。
在你的情况下,如果你删除这两个 @Binds
方法,它应该开始工作(如果没有其他问题)。