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 方法,它应该开始工作(如果没有其他问题)。