【问题标题】:Dagger2 Found Dependency Cycle AndroidDagger2 发现 Android 依赖循环
【发布时间】:2021-03-08 03:47:05
【问题描述】:

我正在学习和更新 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);
    }
}

活动

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();
    }
}

【问题讨论】:

    标签: android dagger-2


    【解决方案1】:

    您以错误的方式使用@Binds。请阅读他们的文档。

    @Binds 方法:
    必须有一个参数,其类型可分配给返回类型。返回类型声明了绑定类型(就像 @Provides 方法一样),参数是它绑定的类型。

    您必须将@Binds 更改为@Provides。

    【讨论】:

    • 但是无论我在哪里使用@Binds,都有一个参数,其类型也是该方法的返回类型。例如在我的情况下 bindsWheels 和 bindsEngine
    • 这不是在您的情况下使用 @Binds 的正确情况
    【解决方案2】:

    @Binds 通常适用于您有一些继承的类及其接口并且您希望 dagger 知道这一点并能够注入接口的情况。通常你会有

    @Binds
    abstract Engine bindsEngine(DieselEngine dieselEngine);
    

    然后你可以在不知道实现细节的情况下注入引擎(它是柴油引擎)。

    在您的情况下,如果您删除了两个 @Binds 方法,它应该开始工作(如果没有其他问题)。

    【讨论】:

      猜你喜欢
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多